You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中移除多变量中相同值占比超80%的行?

解决方法:移除R数据集中取值重复率过高的行

嘿,我来帮你搞定这个问题!你的需求很明确:26个取值在1-12之间的变量,要删掉那些至少80%取值相同的行(也就是某一数值出现≥21次的行)。咱们一步步来拆解:

为什么你之前的代码可能有问题?

你提到用了apply(df1, 1, function(x) mean(x == Mode(x)) <= 0.8),这个思路的核心是用众数(Mode)来判断,但有两个潜在问题:

  1. R语言没有内置的Mode函数,如果你自己实现的Mode函数没有处理「多个众数」的情况(比如一行里两个值各出现13次),可能会导致判断错误;
  2. 就算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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:05:01