R语言根据分组dataframe为主数据框classwork字段匹配标记High/Low类别
原有代码问题说明
- 你使用
==对比两个长度不一致的向量会触发R的循环匹配逻辑,无法得到正确的存在性判断结果,应该用%in%运算符判断值是否属于指定集合。 replace()函数返回修改后的新向量,你没有将结果赋值回原数据框的对应列,修改不会生效。- 你代码中用到的
group1.C、group2.C并未在你提供的数据集里定义,需要先提取group1和group2的classwork值向量。
实现方案
方案1:基础R实现
# 提取两个分组的唯一classwork值 g1_vals <- unique(group1$classwork) g2_vals <- unique(group2$classwork) # 直接赋值生成level列 DATA.RH.TAM$level[DATA.RH.TAM$classwork %in% g1_vals] <- "High" DATA.RH.TAM$level[DATA.RH.TAM$classwork %in% g2_vals] <- "Low"
如果需要封装为单个函数,可以用如下写法:
get_level <- function(val) { if (val %in% g1_vals) return("High") if (val %in% g2_vals) return("Low") return(NA_character_) } DATA.RH.TAM$level <- sapply(DATA.RH.TAM$classwork, get_level)
方案2:dplyr简洁实现
library(dplyr) DATA.RH.TAM <- DATA.RH.TAM %>% mutate(level = case_when( classwork %in% unique(group1$classwork) ~ "High", classwork %in% unique(group2$classwork) ~ "Low", TRUE ~ NA_character_ ))
结果验证
执行完上述代码后可以用以下命令查看分类统计:
table(DATA.RH.TAM$level, useNA = "ifany")
注:如果担心浮点数精度导致匹配失败,可以在匹配前将数值统一保留3位小数:
round(classwork,3) %in% round(g1_vals,3)
内容的提问来源于stack exchange,提问作者Faisal Mustafa
相关产品推荐
相关产品推荐

