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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 03:06:07