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
相关产品推荐
相关产品推荐

