如何在R中移除多变量中相同值占比超80%的行?
解决方法:移除R数据集中取值重复率过高的行
嘿,我来帮你搞定这个问题!你的需求很明确:26个取值在1-12之间的变量,要删掉那些至少80%取值相同的行(也就是某一数值出现≥21次的行)。咱们一步步来拆解:
为什么你之前的代码可能有问题?
你提到用了apply(df1, 1, function(x) mean(x == Mode(x)) <= 0.8),这个思路的核心是用众数(Mode)来判断,但有两个潜在问题:
- R语言没有内置的Mode函数,如果你自己实现的Mode函数没有处理「多个众数」的情况(比如一行里两个值各出现13次),可能会导致判断错误;
- 就算Mode函数没问题,当某值出现次数刚好卡在21次时,
mean(x == Mode(x))是21/26≈0.807,确实会被过滤,但这种方式不如直接统计出现次数直观可靠。
更可靠的实现思路
既然我们知道变量取值范围是1-12,而且只需要判断每行中出现次数最多的数值是否超过20次(因为26*0.8=20.8,所以≤20次就符合保留条件),我们可以直接统计每行的最大出现次数,再做筛选。
方法1:通用版(适合任意取值范围)
用table()统计每行的数值频率,取最大值判断:
# 定义函数:计算一行中出现次数最多的数值的次数 max_occurrence <- function(row) { max(table(row)) } # 筛选出最大出现次数≤20的行(移除≥21次的行) filtered_df <- df1[apply(df1, 1, max_occurrence) <= 20, ]
方法2:高效版(利用取值范围1-12的特点)
因为你的变量取值固定在1-12,用tabulate()会比table()快很多(尤其当数据集很大时):
# 高效版函数:针对1-12的取值,直接统计每个值的出现次数 max_occurrence_fast <- function(row) { max(tabulate(row, nbins = 12)) } # 执行筛选 filtered_df <- df1[apply(df1, 1, max_occurrence_fast) <= 20, ]
测试验证
我们可以构造一个测试数据集来验证代码是否生效:
set.seed(123) # 保证结果可复现 # 正常行:没有值出现超过20次 normal_row <- sample(1:12, 26, replace = TRUE) # 要移除的行:21个1,5个随机其他值 remove_row <- c(rep(1, 21), sample(2:12, 5, replace = TRUE)) test_df <- data.frame(rbind(normal_row, remove_row)) # 运行筛选 result <- test_df[apply(test_df, 1, max_occurrence_fast) <= 20, ] # 查看结果:只会保留正常行 print(result)
这样就能精准地移除那些重复率过高的行啦!
内容的提问来源于stack exchange,提问作者Benji
相关产品推荐
相关产品推荐

