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

