如何将多个二元种族虚拟变量合并为单一分类变量
解决方案
方法1:用tidyverse工具链实现
先加载tidyverse包,通过行处理完成种族变量合并:
library(tidyverse) # 定义种族列与显示名称的对应关系 race_labels <- c( race_nhw = "Non-Hispanic White", race_nhb = "Non-Hispanic Black", race_hlx = "Hispanic/Latino", race_as = "Asian", race_aian = "American Indian/Alaska Native", race_nhpi = "Native Hawaiian/Pacific Islander" ) # 合并种族变量 df <- df %>% rowwise() %>% mutate( # 提取当前行标记为"Yes"的种族名称 selected_races = list(race_labels[which(c_across(starts_with("race_")) == "Yes")]), # 根据选中种族的数量生成分类 race_category = case_when( length(selected_races) == 0 ~ NA_character_, length(selected_races) == 1 ~ selected_races[[1]], TRUE ~ "multiracial" ) ) %>% ungroup() %>% select(-selected_races) # 移除临时变量
方法2:用Base R实现(无需额外包)
如果不想加载第三方包,用Base R的apply函数逐行处理:
# 定义种族列与显示名称的对应关系 race_labels <- c( race_nhw = "Non-Hispanic White", race_nhb = "Non-Hispanic Black", race_hlx = "Hispanic/Latino", race_as = "Asian", race_aian = "American Indian/Alaska Native", race_nhpi = "Native Hawaiian/Pacific Islander" ) # 筛选所有以"race_"开头的列 race_cols <- grep("^race_", names(df)) # 生成合并后的种族分类列 df$race_category <- apply(df[, race_cols], 1, function(row) { yes_count <- sum(row == "Yes") if (yes_count == 0) { NA_character_ } else if (yes_count == 1) { race_labels[names(row)[row == "Yes"]] } else { "multiracial" } })
验证输出
执行完代码后,可通过以下命令查看合并结果:
df %>% select(sex, starts_with("race_"), race_category)
内容的提问来源于stack exchange,提问作者HoyaMD
相关产品推荐
相关产品推荐

