R语言不使用dplyr包筛选含多个个体分组的实现方法
R 基础操作:无dplyr依赖筛选符合独立个体数要求的分组
问题背景
现有数据集规则如下:
- 每个分组包含1或2个独立个体
- 单个个体可能对应多条数据条目
示例数据构造代码:
group<-c(1,1,1,1,2,2,3,3,3,3,4,4) individualID<-c(1,1,2,2,3,3,5,5,6,6,7,7) X<-rbinom(12,1,0.5) df1<-data.frame(group,individualID,X)
示例数据输出:
> df1 group individualID X 1 1 1 0 2 1 1 1 3 1 2 1 4 1 2 1 5 2 3 1 6 2 3 1 7 3 5 1 8 3 5 1 9 3 6 1 10 3 6 1 11 4 7 0 12 4 7 1
统计各分组独立个体数的基础代码:
aggregate(data = df1, individualID ~ group, function(x) length(unique(x)))
统计结果:
group individualID 1 1 2 2 2 1 3 3 2 4 4 1
需求
不依赖dplyr包,仅保留分组内独立个体数>1的分组(即保留分组1、3的所有数据,删除分组2、4的所有数据)
实现方案
方案1:分步骤筛选(可读性高)
- 先统计每个分组的独立个体数量,生成统计表
group_ind_count <- aggregate(individualID ~ group, df1, function(x) length(unique(x)))
- 筛选出符合要求(独立个体数>1)的分组编号
target_groups <- group_ind_count$group[group_ind_count$individualID > 1]
- 从原数据中提取对应分组的所有行
result <- df1[df1$group %in% target_groups, ]
方案2:单行实现(用ave函数,代码更简洁)
直接通过ave函数为每行生成分组对应的独立个体数,用逻辑条件直接筛选:
result <- df1[ave(df1$individualID, df1$group, FUN = function(x) length(unique(x))) > 1, ]
输出验证
两种方案得到的结果一致,均仅保留分组1和3的全部8条数据:
> result group individualID X 1 1 1 0 2 1 1 1 3 1 2 1 4 1 2 1 7 3 5 1 8 3 5 1 9 3 6 1 10 3 6 1
内容的提问来源于stack exchange,提问作者John Majimboni
相关产品推荐
相关产品推荐

