r语言 - 组合多个列以创建单个变量



我使用的数据集记录了受访者的种族。回答是跨多个变量记录的,受访者可以选择多个变量。例子:

Black White Asian Hispanic 
1     NA    NA    NA
NA    1     NA    NA
NA    NA    NA    1
NA    NA    1     1

^^^在最后一行,被调查者会选择亚洲人和西班牙人。

我想做的是:

A)将这些列合并成一个单一的种族变量,用不同的数字代表不同的种族(例如,黑人将是1,白人将是2等)

B)让任何报告多个专栏的人都被指定为"multiple"。

我是一个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"

最新更新