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

R语言:如何筛选在指定列包含全部目标值的数据分组

R语言实现按分组筛选包含全部目标数值的记录

需求:从数据框中按ID分组,判断每个分组的number列是否包含全部目标数值(示例中目标数值为1,2,3,4),最终生成包含分组标识、分组所属类别及判断结果的汇总表。

示例数据集

df <- structure(list(ID=c('a','a','a','a','b','b','c','c','d','d','d','d','e','e','f','f','f','g','h','h','h','h','i','i','i','i'),
                     A1=c('g1','g1','g1','g1','g1','g1','g1','g1','g2','g2','g2','g2','g2','g2','g2', 'g2','g2','g3', 'g3','g3','g3','g3','g3','g3', 'g3','g3'),
                     number=c(1, 2,3,4,1,2,1,3,1,2,3,4,2,3,2,3,4,1,1,2,3,4,1,2,3,4)), 
                class = "data.frame", row.names = c(NA,-26L))

期望结果

df.result <- structure(list(ID=c('a','b','c','d','e','f','g','h','i'),
                     A1=c('g1','g1','g1','g2','g2','g2','g3','g3','g3'),
                     all.numbers=c('yes','no','no','yes','no','no','no','yes','yes')), 
                class = "data.frame", row.names = c(NA,-9L))

实现方法

方法1:使用dplyr包(语法简洁,推荐)

先安装并加载dplyr包,按ID分组后判断每组是否包含全部目标值:

# 首次使用需安装dplyr
# install.packages("dplyr")
library(dplyr)

# 定义需要检查的目标数值
target_numbers <- c(1,2,3,4)

df.result <- df %>%
  group_by(ID) %>%
  summarise(
    A1 = first(A1),  # 每个ID对应唯一A1,取第一个值即可
    all.numbers = ifelse(all(target_numbers %in% number), "yes", "no")
  ) %>%
  ungroup()

方法2:使用base R实现(无需额外包)

利用base R的聚合函数完成分组判断:

target_numbers <- c(1,2,3,4)

# 定义判断函数:检查当前组是否包含全部目标值
check_full_set <- function(num_vec) {
  ifelse(all(target_numbers %in% num_vec), "yes", "no")
}

# 按ID和A1分组聚合,生成结果
df.result <- aggregate(
  number ~ ID + A1, 
  data = df, 
  FUN = check_full_set
)
# 修改结果列名
names(df.result)[3] <- "all.numbers"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:25:27