在R中如何将因子的多个水平合并为新的分组水平?
R语言因子水平分组的简便实现方案
你当前使用的多层嵌套ifelse写法可读性差、容易出现语法错误、后续调整分组规则的维护成本很高,推荐以下两种更简便的实现方式:
方案1:使用dplyr的case_when函数
该方案逻辑清晰,每一行对应一个分组规则,便于阅读和调整:
library(dplyr) neigh_agg <- function(df) { df %>% mutate(Neighborhood2 = case_when( # 匹配Neigh_1分组的所有水平 Neighborhood %in% c("Blmngtn", "Blueste", "ClearCr", "CollgCr", "Crawfor", "Gilbert", "Greens", "GrnHill", "NPkVill", "NWAmes", "SawyerW", "Veenker") ~ "Neigh_1", # 匹配Neigh_2分组的所有水平 Neighborhood %in% c("BrDale", "BrkSide", "Edwards", "IDOTRR", "MeadowV", "OldTown", "Sawyer", "SWISU") ~ "Neigh_2", # 匹配Neigh_3分组的所有水平 Neighborhood %in% c("NAmes", "Mitchel") ~ "Neigh_3", # 匹配Neigh_4分组的所有水平 Neighborhood %in% c("StoneBr", "NoRidge", "NridgHt") ~ "Neigh_4", # 剩余所有水平归为Neigh_5 TRUE ~ "Neigh_5" ) %>% as.factor()) }
方案2:使用命名向量做映射
该方案适合分组数量多、映射关系需要复用的场景,运行效率更高:
library(dplyr) # 提前构建水平→分组的映射关系 neigh_map <- c( # Neigh_1分组映射 Blmngtn = "Neigh_1", Blueste = "Neigh_1", ClearCr = "Neigh_1", CollgCr = "Neigh_1", Crawfor = "Neigh_1", Gilbert = "Neigh_1", Greens = "Neigh_1", GrnHill = "Neigh_1", NPkVill = "Neigh_1", NWAmes = "Neigh_1", SawyerW = "Neigh_1", Veenker = "Neigh_1", # Neigh_2分组映射 BrDale = "Neigh_2", BrkSide = "Neigh_2", Edwards = "Neigh_2", IDOTRR = "Neigh_2", MeadowV = "Neigh_2", OldTown = "Neigh_2", Sawyer = "Neigh_2", SWISU = "Neigh_2", # Neigh_3分组映射 NAmes = "Neigh_3", Mitchel = "Neigh_3", # Neigh_4分组映射 StoneBr = "Neigh_4", NoRidge = "Neigh_4", NridgHt = "Neigh_4", # Neigh_5分组映射 Somerst = "Neigh_5", Timber = "Neigh_5" ) neigh_agg <- function(df) { df %>% mutate( Neighborhood2 = as.factor(neigh_map[as.character(Neighborhood)]) # 如果存在未匹配的水平,可以加下面这行设置默认值 # Neighborhood2 = replace_na(Neighborhood2, "Neigh_5") ) }
内容的提问来源于stack exchange,提问作者Ahmed Mostafa
相关产品推荐
相关产品推荐

