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

R语言去除被其他行包含的冗余重复行

解决方法

核心逻辑:若某行所有非NA值都能在另一行对应位置找到匹配,且另一行拥有更多非NA值,则当前行为弱重复行,予以移除;反之保留。以下是无需group_by的可靠实现方案:

逻辑拆解

  1. 为每行提取「非NA列名-对应值」的有效特征集合,同时统计该行非NA值的数量。
  2. 对每行逐一检查:是否存在其他行,既包含当前行的全部有效特征,又拥有更多非NA值。
  3. 仅保留不满足上述弱重复条件的行。

R代码实现

# 示例数据集
data <- data.frame(
  col1 = c("A", "A", "A", NA, NA),
  col2 = c("B", "B", "B", NA, NA),
  col3 = c("D", NA, NA, "D", NA),
  col4 = c("G", NA, NA, "G", NA),
  col5 = c(NA, NA, "H", NA, "H"),
  stringsAsFactors = FALSE
)

# 判断单行是否为弱重复行的函数
is_weak_duplicate <- function(row_idx, data) {
  current_row <- data[row_idx, ]
  current_features <- current_row[!is.na(current_row)]
  current_nonna <- length(current_features)
  
  # 全NA行直接标记为弱重复(可根据需求调整)
  if (current_nonna == 0) return(TRUE)
  
  # 遍历所有其他行进行对比
  for (j in seq_len(nrow(data))) {
    if (j == row_idx) next
    comp_row <- data[j, ]
    comp_features <- comp_row[!is.na(comp_row)]
    comp_nonna <- length(comp_features)
    
    # 满足两个条件则判定为弱重复:对比行非NA更多,且包含当前行所有特征
    if (comp_nonna > current_nonna) {
      comp_matched <- comp_features[names(current_features)]
      if (all(comp_matched == current_features, na.rm = FALSE)) {
        return(TRUE)
      }
    }
  }
  return(FALSE)
}

# 筛选保留非弱重复行
filtered_data <- data[!sapply(seq_len(nrow(data)), is_weak_duplicate, data = data), ]

# 输出结果
print(filtered_data)

结果验证

运行后得到的精简数据集与预期完全一致:

col1col2col3col4col5
ABDGNA
ABNANAH

效率优化(针对大数据集)

如果数据集行数极多,可改用purrr包实现并行处理提升效率:

library(purrr)
filtered_data <- data[!map_lgl(seq_len(nrow(data)), is_weak_duplicate, data = data), ]

该方案不会误删带有唯一有效信息的行,只要某行存在无法被其他行覆盖的非NA值,就会被保留。

内容的提问来源于stack exchange,提问作者Bestsheep17

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:55:55