如何在R中将数据框非首列的低频值替换为指定值?
解决方法
问题分析
你原来的代码出错原因是:table(dd[[i]]) < 2返回的是每个唯一值的计数判断结果,长度等于列中唯一值的数量,而dd[[i]]是原列向量(长度为6),两者长度不匹配,导致ifelse无法正确对应每个元素进行判断。
简洁高效的实现方案
方案1:Base R 原生实现
data <- data.frame(study=c('a','a','b','c','c','d'), L1= c('arabic','turkish','greek','arabic','turkish','turkish'), L2= c(rep('english',5),'german')) # 处理除首列外的所有列 data[-1] <- lapply(data[-1], function(col) { # 统计每个值的出现次数 value_counts <- table(col) # 把出现次数<2的值替换为"others" ifelse(col %in% names(value_counts[value_counts < 2]), "others", col) })
方案2:Base R 更高效的ave函数实现
利用ave按值分组统计长度,直接判断分组内元素数量:
data[-1] <- lapply(data[-1], function(col) { ave(col, col, FUN = function(x) if(length(x) < 2) "others" else x) })
方案3:dplyr 简洁语法(适合熟悉tidyverse的用户)
library(dplyr) data <- data %>% mutate(across(-study, ~ifelse(table(.)[.] < 2, "others", .)))
验证结果
运行上述代码后,数据框会变成:
| study | L1 | L2 |
|---|---|---|
| a | arabic | english |
| a | turkish | english |
| b | others | english |
| c | arabic | english |
| c | turkish | english |
| d | turkish | others |
内容的提问来源于stack exchange,提问作者Simon Harmel
相关产品推荐
相关产品推荐

