R语言实现筛选data.frame指定列值恰好重复2次的行
R自定义筛选函数修正方案
原有代码存在的核心问题
- 函数形参写法非法:R函数定义时不支持直接写
df$x这种带索引提取的格式,无法正常接收传入的数据集和列参数 - 功能不匹配需求:原有逻辑仅支持对单独向量做重复值标记,没有实现「输入数据框、指定列、返回筛选后子集」的核心诉求
- 判断逻辑有缺陷:
duplicated(x) & rev(duplicated(rev(x)))的写法只能标记取值出现次数≥2的行,无法排除出现3次及以上的取值,不符合「恰好出现2次」的筛选规则
正确实现代码
filter_dup_twice <- function(df, col, as.bool = FALSE) { # 基础参数校验 if (!is.data.frame(df)) stop("第一个入参必须为data.frame类型") if (!col %in% names(df)) stop("指定的列不存在于输入数据框中") # 统计目标列各取值的出现次数 target_vals <- df[[col]] val_freq <- table(target_vals) # 标记取值恰好出现2次的行 keep_logical <- target_vals %in% names(val_freq[val_freq == 2]) # 按参数要求返回结果 if (as.bool) { return(keep_logical) } return(df[keep_logical, , drop = FALSE]) }
使用方法
# 构造测试数据 df_demo <- data.frame( group = c("A", "B", "A", "C", "C", "B", "D"), value = 1:7 ) # 1. 直接返回筛选后的数据子集(默认as.bool=FALSE) filter_dup_twice(df_demo, col = "group") # 2. 返回和原数据等长的逻辑向量,可用于后续其他计算 filter_dup_twice(df_demo, col = "group", as.bool = TRUE)
注:如果需要适配非标准计算、支持直接传入裸列名(不用写引号),可以在函数里加
col <- deparse(substitute(col))做转换,日常用字符串传列名兼容性更好。
内容的提问来源于stack exchange,提问作者Daisy
相关产品推荐
相关产品推荐

