在R中按字符型ID分组计数并保留原表的实现方法
解决R语言中字符型ID分组计数且保留原表结构的问题
核心问题分析
你之前的代码存在两个关键问题:
summarise是聚合类函数,会将每个分组压缩为单行,必然导致原数据表折叠sum(id)完全不适用于字符型变量,sum是针对数值的求和函数,对字符ID无效
正确实现方法
要在保留原表所有行的前提下,为每个ID分组添加计数列,推荐使用 dplyr 包的 mutate 配合 n() 函数(n() 可返回当前分组的总行数):
library(dplyr) # 给原数据框新增count列,记录每个id分组的行数 d <- d %>% group_by(id) %>% mutate(count = n()) %>% ungroup() # 取消分组状态,避免后续操作受分组约束
运行后数据会和你期望的示例结果完全一致:每个ID对应的所有行都会带上该分组的总行数。
Base R 替代方案
如果不想依赖dplyr,也可以用base R的 ave 函数实现:
# 直接给原数据框添加count列 d$count <- ave(rep(1, nrow(d)), d$id, FUN = length)
后续筛选示例
新增count列后,可基于分组行数进行数据筛选,比如只保留分组行数≥2的数据:
# dplyr方式 filtered_data <- d %>% filter(count >= 2) # base R方式 filtered_data <- d[d$count >= 2, ]
内容的提问来源于stack exchange,提问作者jacerl980
相关产品推荐
相关产品推荐

