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

R语言:如何基于两类条件识别数据框中的重复行

R语言实现getRepplicate函数识别特定重复行

我们需要实现一个getRepplicate函数,用来标记数据框中同时满足以下两个条件的行:

  • 条件1:指定的allCol列中所有元素完全相同(即这些行属于同一个分组)
  • 条件2:在该分组内,指定的anyCol列中至少有一列存在重复值
    满足两个条件的行标记isReplicate = TRUE,否则为FALSE。

函数参数

  • df: 输入的数据框
  • allCol: 字符向量,指定用于判断"全相同"的列名
  • anyCol: 字符向量,指定用于判断"至少一列重复"的列名

函数实现

基于dplyr的实现(简洁易读)

library(dplyr)

getRepplicate <- function(df, allCol, anyCol) {
  df %>%
    # 按allCol指定的列分组
    group_by(across(all_of(allCol))) %>%
    mutate(
      # 检查分组内anyCol的每一列是否存在重复,只要有一列满足就返回TRUE
      has_any_dup = any(sapply(across(all_of(anyCol)), function(col) any(duplicated(col) | duplicated(col, fromLast = TRUE)))),
      isReplicate = has_any_dup
    ) %>%
    ungroup() %>%
    select(-has_any_dup) # 删除临时辅助列
}

基于Base R的实现(无需额外包)

getRepplicate <- function(df, allCol, anyCol) {
  # 生成分组标识键,将allCol的列值拼接成字符串
  group_key <- do.call(paste, df[allCol])
  
  # 按分组逐一判断是否满足条件
  df$isReplicate <- ave(1:nrow(df), group_key, FUN = function(idx) {
    sub_group <- df[idx, anyCol, drop = FALSE]
    # 检查分组内任意一列是否有重复值(唯一值数量小于分组行数即说明有重复)
    any(sapply(sub_group, function(col) length(unique(col)) < length(col)))
  })
  
  # 将结果转换为逻辑型
  df$isReplicate <- as.logical(df$isReplicate)
  return(df)
}

示例验证

示例数据

df <- data.frame(
  a = c(1, 1, 2, 3, 4, 1, 1, 3),
  b = c(1, 2, 2, 3, 4, 1, 1, 3), 
  d = c("x", "y", "z", "x", "x", "y", "x", "x"),
  e = c("x", "y", "z", "x", "x", "x", "z", "x")
)

调用函数

df2 <- getRepplicate(df, allCol = c("a", "b"), anyCol = c("d", "e"))

预期输出

> df2
  a b d e isReplicate
1 1 1 x x        TRUE
2 1 2 y y       FALSE
3 2 2 z z       FALSE
4 3 3 x x        TRUE
5 4 4 x x       FALSE
6 1 1 y x        TRUE
7 1 1 x z        TRUE
8 3 3 x x        TRUE

结果说明

  • 行1、6、7属于a=1,b=1分组:该分组内d列有重复值("x"出现2次)、e列也有重复值("x"出现2次),满足双条件,标记为TRUE
  • 行4、8属于a=3,b=3分组:分组内d和e列均存在重复值,标记为TRUE
  • 其余分组(a=1,b=2、a=2,b=2、a=4,b=4)的anyCol列无重复值,标记为FALSE

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 09:45:27