我使用的数据集记录了受访者的种族。回答是跨多个变量记录的,受访者可以选择多个变量。例子:
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"