R语言按条件删除重复行:前6列相同则保留C7为Real的行
R实现删除指定规则重复行
输入数据框df
C1 C2 C3 C4 C5 C6 C7 12 R11 D21 201901 09 21 R23 D77 201901 21 33 R43 D87 201901 31 D87 Real 33 R43 D87 201901 31 D87 Fetched 57 R12 D87 201901 12 D87 Fetched
期望输出
C1 C2 C3 C4 C5 C6 C7 12 R11 D21 201901 09 21 R23 D77 201901 21 33 R43 D87 201901 31 D87 Real 57 R12 D87 201901 12 D87 Fetched
处理规则
- 第3、4行前6列完全相同,仅第7列C7存在差异,其中第3行C7为
Real、第4行C7为Fetched,需要删除第4行这类「前6列已存在对应C7为Real的重复行」 - 第1、2行C6、C7为空,不需要删除
- 第5行不存在前6列相同且C7为Real的重复行,保留
实现代码
方法1:dplyr实现(更简洁)
# 加载依赖包 library(dplyr) # 构造测试数据 df <- read.table(text = "C1 C2 C3 C4 C5 C6 C7 12 R11 D21 201901 09 NA NA 21 R23 D77 201901 21 NA NA 33 R43 D87 201901 31 D87 Real 33 R43 D87 201901 31 D87 Fetched 57 R12 D87 201901 12 D87 Fetched", header = T, fill = T, stringsAsFactors = F) # 按规则过滤 res <- df %>% group_by(C1, C2, C3, C4, C5, C6) %>% # 按前6列分组 filter(!(n() > 1 & "Real" %in% C7 & C7 == "Fetched")) %>% # 组内存在Real则删除同组的Fetched ungroup()
方法2:R基础包实现
# 构造测试数据同上 df <- read.table(text = "C1 C2 C3 C4 C5 C6 C7 12 R11 D21 201901 09 NA NA 21 R23 D77 201901 21 NA NA 33 R43 D87 201901 31 D87 Real 33 R43 D87 201901 31 D87 Fetched 57 R12 D87 201901 12 D87 Fetched", header = T, fill = T, stringsAsFactors = F) # 提取所有C7为Real的前6列标识 real_keys <- df[!is.na(df$C7) & df$C7 == "Real", 1:6] # 标记需要删除的行:C7为Fetched且前6列命中real_keys的行 del_flag <- apply(df, 1, function(x) { if (is.na(x["C7"]) || x["C7"] != "Fetched") return(FALSE) return(any(apply(real_keys, 1, function(y) all(y == x[1:6])))) }) # 过滤得到结果 res <- df[!del_flag, ]
内容的提问来源于stack exchange,提问作者InVinci
相关产品推荐
相关产品推荐

