R语言如何将仅含两个唯一值的列替换为该列最高频率值
R代码实现方案
核心逻辑说明
逐列遍历数据框,对每一列先统计唯一值数量:
- 唯一值数量为2时,统计列内各值的出现频率,用出现频率最高的值替换该列所有值
- 唯一值数量不为2时,保留列的原始值
完整可运行代码
第一步:构造原始数据框
r1 <- c("M","A","T","D","T","Y") r2 <- c("M","A","G","G","D", "J") r3 <- c("M","B","H","G","T", "Y") r4 <- c("M","B","G","G","X", "Y") r5<- c("F","A","H","D","T", "Y") n.mat <- rbind(r1,r2,r3,r4,r5) n.mat<-as.data.frame(n.mat)
第二步:编写处理逻辑并执行
基础R实现(无需加载额外包)
# 定义单列处理函数 col_processor <- function(col) { unique_n <- length(unique(col)) if (unique_n == 2) { # 取出现频率最高的值 top_val <- names(which.max(table(col))) return(rep(top_val, length(col))) } return(col) } # 对所有列应用处理函数 n.mat_result <- as.data.frame(lapply(n.mat, col_processor))
dplyr简洁实现(适合tidyverse用户)
library(dplyr) n.mat_result <- n.mat %>% mutate(across(everything(), ~ { if (length(unique(.x)) == 2) names(which.max(table(.x))) else .x }))
结果验证
执行完成后打印n.mat_result即可看到和预期一致的输出结果。如果列内两个唯一值出现频率相同,which.max会默认取字母序靠前的值,你可以根据自身需求调整频率判断逻辑。
内容的提问来源于stack exchange,提问作者Luker354
相关产品推荐
相关产品推荐

