如何按姓名分组将种族变量重编码为多种族类别
基于姓名分组重编码多种族记录的优化实现
你的需求可以通过更紧凑的dplyr管道操作完成,全程不需要额外中间变量,代码逻辑更清晰:
library(dplyr) # 示例数据 df <- data.frame('Name' = c("Jon", "Jon", "Bobby", "Sarah", "Fred"), 'Race' = c("Black", "White", "Asian", "Asian", "Black")) # 优化后的实现 df1 <- df %>% distinct(Name, Race) %>% # 先去除重复的姓名-种族组合 group_by(Name) %>% summarise( # 分组判断:多种族则标记为Multiracial,否则保留原种族 Race = if_else(n_distinct(Race) > 1, "Multiracial", first(Race)) ) %>% ungroup()
优化点说明
- 减少中间变量:原代码需要单独创建
multi_answer存储分组统计结果,这里直接在管道内完成判断和重编码,避免冗余变量 - 风格统一:全程使用dplyr的管道语法,替代原代码中混合基础R的索引操作(
df1[df1$Name %in% ...]),代码可读性更强 - 自动去重:
summarise按姓名分组后,每个姓名只会生成一行结果,不需要像原代码那样二次调用unique(df1)
如果想进一步简化,因为第一步已经用distinct去重了分组内的重复种族,所以可以用n()替代n_distinct(Race),效率更高:
df1 <- df %>% distinct(Name, Race) %>% group_by(Name) %>% summarise( Race = case_when( n() > 1 ~ "Multiracial", TRUE ~ Race ) ) %>% ungroup()
内容的提问来源于stack exchange,提问作者snailwhale
相关产品推荐
相关产品推荐

