如何用data.frame按ID分组统计days>20的记录数并填充全组?
实现data.frame分组计数并填充所有行的方法
我来帮你搞定这个需求!你想要给每个ID对应的所有行,都填充该ID下满足days > 20的记录总数,之前用data.table的写法只给符合条件的行赋值,下面用base R和tidyverse两种方案来实现:
方案一:Base R的ave()函数(无需额外包)
首先先构造你的示例数据框:
dataset1 <- data.frame( ID = c(1, 1, 1, 2, 2), days = c(2, 31, 22, 24, 19) )
然后用ave()函数完成分组计数并填充:
dataset1$Count <- with(dataset1, ave(days > 20, ID, FUN = sum))
原理说明:
days > 20会生成一个逻辑向量,其中TRUE等价于1,FALSE等价于0ave()函数按照ID分组,对每组的逻辑向量求和,就能得到该ID下满足条件的记录数- 最终结果会自动匹配原数据的行数,给同一ID的所有行都填充相同的Count值
方案二:用dplyr包(tidyverse风格,代码更直观)
如果你习惯使用tidyverse工具链,用dplyr的分组操作会更清晰:
library(dplyr) dataset1 <- dataset1 %>% group_by(ID) %>% # 按ID分组 mutate(Count = sum(days > 20)) %>% # 新增Count列,计算每组符合条件的数量 ungroup() # 取消分组(可选,避免后续操作受分组影响)
运行任意一种方案后,你都会得到期望的结果:
ID | days | Count 1 | 2 | 2 1 | 31 | 2 1 | 22 | 2 2 | 24 | 1 2 | 19 | 1
内容的提问来源于stack exchange,提问作者Shigaell
相关产品推荐
相关产品推荐

