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