组合多个列以创建单个变量

Combining Multiple Columns to Create a Single Variable

我正在使用记录受访者种族的数据集。响应记录在多个变量中,并且允许受访者选择一个以上。示例:

Black White Asian Hispanic 

1     NA    NA    NA

NA    1     NA    NA

NA    NA    NA    1

NA    NA    1     1

^^^在最后一行,受访者会选择亚裔和西班牙裔。

我想做的是:

A) 将这些列折叠成一个单一的种族变量,不同的数字代表不同的种族(即黑人代表 1,白人代表 2 等)

B) 拥有它,以便报告多个列的任何人都被指定为“多个”。

我是一个 R 新手,所以任何帮助将不胜感激!

执行此操作的一种方法是将您的列名称作为一个列进行透视,按受访者对值进行分组,然后删除 NA 值。然后只需选择每个组保留的种族值,必要时切换到“多个”。下面是使用 tidyverse 的一种方法:

library(tidyverse)

df %>% 
  rownames_to_column("respondent") %>% 
  pivot_longer(-respondent) %>% 
  group_by(respondent) %>% 
  filter(!is.na(value)) %>% 
  summarise(eth = ifelse(n() == 1, name, "multiple"))

# A tibble: 4 x 2
  respondent eth     
  <chr>      <chr>   
1 1          Black   
2 2          White   
3 3          Hispanic
4 4          multiple

您将无法将数字存储为数字类型,并使用像“variable”这样的字符串 - 因此您可以选择。要么坚持使用种族标签(如上面的解决方案),要么将标签转换为数字,然后将数字转换为这些数字的字符串表示形式。这似乎有点笨拙,但如果你想这样做,方法如下:

df %>% 
  rownames_to_column("respondent") %>% 
  pivot_longer(-respondent) %>% 
  mutate(eth_num = as.character(as.numeric(fct_inorder(name)))) %>% 
  group_by(respondent) %>% 
  filter(!is.na(value)) %>% 
  summarise(eth = ifelse(n() == 1, eth_num, "multiple"))

# A tibble: 4 x 2
  respondent eth     
  <chr>      <chr>   
1 1          1       
2 2          2       
3 3          4       
4 4          multiple

这是一个基本的 R 选项 -

#Get the name of column with non-NA value
ethinicty <- names(df)[max.col(!is.na(df))]
#If there are more than 1 option selected change it to 'multiple'
ethinicty[rowSums(!is.na(df)) > 1] <- 'multiple'
ethinicty

#[1] "Black"    "White"    "Hispanic" "multiple"