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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:51:21