在R语言中为出现次数最多的值分配新值的实现方法
解决方法
可以使用dplyr包的across函数批量处理除name外的列,结合自定义逻辑提取每列的众数后完成值的替换:
- 先定义提取列众数的函数(自动忽略NA,若列全为NA则返回NA):
get_mode <- function(x) { x_clean <- na.omit(x) if (length(x_clean) == 0) return(NA) freq_table <- table(x_clean) names(freq_table)[which.max(freq_table)] }
- 加载
dplyr并处理数据集:
library(dplyr) df_out2 <- df_out %>% mutate( across(-name, ~case_when( is.na(.) ~ as.character(.), # 保留原始NA值 . == get_mode(.) ~ "consensus", TRUE ~ "non-consensus" )) )
运行后得到的df_out2会完全匹配你期望的结果:
Factor1中出现次数最多的C被标记为consensus,其余A、B为non-consensuscol3中出现次数最多的S被标记为consensus,T为non-consensuscol4中出现次数最多的E被标记为consensus,D为non-consensusname列保持原样,NA值也会被保留
内容的提问来源于stack exchange,提问作者Marwah Al-kaabi
相关产品推荐
相关产品推荐

