如何在R中删除所有列均存在连续重复的行?
问题
我有一个包含4列、超过1万行的大型data frame,其中多数行存在重复。我希望仅删除所有4列均存在连续重复的行,保留其余行(包括非连续的重复行)。
原数据前10行如下:
ENTREZID G1.SYMBOL G2.SYMBOL G3.SYMBOL <chr> <chr> <chr> <chr> 1 105378589 LOC105378589 LOC105378589 LOC105378589 2 2563 GABRD GABRD GABRD 3 2563 GABRD GABRD GABRD 4 2563 GABRD GABRD GABRD 5 339448 C1orf174 C1orf174 NA 6 339448 C1orf174 C1orf174 C1orf174 7 55966 AJAP1 AJAP1 AJAP1 8 10277 UBE4B UBE4B NA 9 2810 SFN SFN SFN 10 339488 TFAP2E NA TFAP2E
预期输出:
ENTREZID G1.SYMBOL G2.SYMBOL G3.SYMBOL <chr> <chr> <chr> <chr> 1 105378589 LOC105378589 LOC105378589 LOC105378589 2 2563 GABRD GABRD GABRD 5 339448 C1orf174 C1orf174 NA 6 339448 C1orf174 C1orf174 C1orf174 7 55966 AJAP1 AJAP1 AJAP1 8 10277 UBE4B UBE4B NA 9 2810 SFN SFN SFN 10 339488 TFAP2E NA TFAP2E
解决方案
方法1:使用dplyr包(推荐,高效简洁)
通过判断当前行与前一行是否完全一致,筛选出非连续重复的行:
library(dplyr) # 假设数据框名为df df_cleaned <- df %>% filter(!rowwise_all(~ . == lag(.)))
也可以拆分列逐一判断,逻辑更直观:
df_cleaned <- df %>% filter(!(ENTREZID == lag(ENTREZID) & G1.SYMBOL == lag(G1.SYMBOL) & G2.SYMBOL == lag(G2.SYMBOL) & G3.SYMBOL == lag(G3.SYMBOL)))
方法2:使用Base R
通过逐行比较当前行与前一行的所有列值,完成筛选:
# 计算每行是否与前一行完全重复 is_duplicate <- sapply(2:nrow(df), function(i) all(df[i,] == df[i-1,])) # 第一行无前驱,标记为非重复 is_duplicate <- c(FALSE, is_duplicate) # 保留非连续重复的行 df_cleaned <- df[!is_duplicate, ]
注意事项
- 两种方法均只删除连续的完全重复行,非连续的重复行会被保留
- 处理大型数据时,dplyr方法的运行效率更高
- 针对
NA值:R中NA == NA返回NA,但上述方法会将两行对应位置的NA视为相等,符合需求
内容的提问来源于stack exchange,提问作者Debajyoti Kabiraj
相关产品推荐
相关产品推荐

