R语言去除被其他行包含的冗余重复行
解决方法
核心逻辑:若某行所有非NA值都能在另一行对应位置找到匹配,且另一行拥有更多非NA值,则当前行为弱重复行,予以移除;反之保留。以下是无需group_by的可靠实现方案:
逻辑拆解
- 为每行提取「非NA列名-对应值」的有效特征集合,同时统计该行非NA值的数量。
- 对每行逐一检查:是否存在其他行,既包含当前行的全部有效特征,又拥有更多非NA值。
- 仅保留不满足上述弱重复条件的行。
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)
结果验证
运行后得到的精简数据集与预期完全一致:
| col1 | col2 | col3 | col4 | col5 |
|---|---|---|---|---|
| A | B | D | G | NA |
| A | B | NA | NA | H |
效率优化(针对大数据集)
如果数据集行数极多,可改用purrr包实现并行处理提升效率:
library(purrr) filtered_data <- data[!map_lgl(seq_len(nrow(data)), is_weak_duplicate, data = data), ]
该方案不会误删带有唯一有效信息的行,只要某行存在无法被其他行覆盖的非NA值,就会被保留。
内容的提问来源于stack exchange,提问作者Bestsheep17
相关产品推荐
相关产品推荐

