如何用dplyr筛选成员数超过n的分组?
解决方案
错误原因
你当前的代码用row_number() > 3是筛选每个分组内位置大于3的行,而非筛选整个分组的成员数量超过3的组,所以只得到了单条数据。
dplyr 解决方案
使用n()函数获取当前分组的总成员数,在filter()中判断该值是否大于临界值,即可选中整个符合条件的分组:
library(dplyr) # 先修正数据框的长度不一致问题(原代码中ID长度13,Sequ长度14) df <- data.frame( ID = letters[1:14], Sequ = c(NA,1,1,1,2,3,3,3,NA,NA,4,4,4,4) ) # 筛选成员数超过3的分组 df %>% group_by(Sequ) %>% filter(n() > 3) %>% ungroup() # 可选,取消分组状态,返回普通数据框
执行后会输出整个Sequ=4的分组:
ID Sequ 1 k 4 2 l 4 3 m 4 4 n 4
如果需要排除NA的分组(即使NA组的成员数超过3),可以在filter()中增加判断:
df %>% group_by(Sequ) %>% filter(n() > 3 & !is.na(Sequ)) %>% ungroup()
其他解决方案
Base R 实现
# 统计每个Sequ的成员数 sequ_counts <- table(df$Sequ) # 筛选成员数超过3的Sequ值 target_sequ <- as.numeric(names(sequ_counts[sequ_counts > 3])) target_sequ <- target_sequ[!is.na(target_sequ)] # 提取对应分组 subset(df, Sequ %in% target_sequ)
data.table 实现
library(data.table) setDT(df)[, if(.N > 3) .SD, by = Sequ]
内容的提问来源于stack exchange,提问作者Chris Ruehlemann
相关产品推荐
相关产品推荐

