1

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

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 新手,所以任何帮助将不胜感激!

4

2 回答 2

1

一种方法是将您的列名作为一列进行旋转,按受访者对值进行分组,然后删除 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

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

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
于 2021-07-23T00:30:03.057 回答
0

这是一个基本的 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"
于 2021-07-23T03:27:49.117 回答