如何对含重复行的data.frame数据进行分组汇总?
解决R数据框重复行的数值汇总问题
嘿,这问题我熟!针对你手里的people数据框,我们可以用两种常用的R方法来完成你要的汇总需求——不管你习惯基础R语法,还是喜欢tidyverse的风格,都能轻松搞定~
先确认下你的原始数据:
# 构造示例数据 people <- data.frame( role = c("A", "A", "A", "B", "A", "A"), name = c("Chet Baker", "Chet Baker", "Miles Davis", "Miles Davis", "Miles Davis", "Bill Evans"), n = c(1, 2, 2, 5, 1, 1) ) head(people) # role name n # 1 A Chet Baker 1 # 2 A Chet Baker 2 # 3 A Miles Davis 2 # 4 B Miles Davis 5 # 5 A Miles Davis 1 # 6 A Bill Evans 1
1. 按name汇总得到sum_people
方法一:基础R的aggregate()函数
基础R自带的aggregate()函数可以直接按指定列分组求和,写法很直观:
sum_people <- aggregate(n ~ name, data = people, FUN = sum) sum_people # name n # 1 Chet Baker 3 # 2 Miles Davis 8 # 3 Bill Evans 1
方法二:tidyverse风格(dplyr包)
如果你习惯用管道符%>%的流畅写法,可以用dplyr包来实现:
# 先加载dplyr包(如果没安装先运行 install.packages("dplyr")) library(dplyr) sum_people <- people %>% group_by(name) %>% # 按name分组 summarise(n = sum(n), # 对每组的n求和 .groups = "drop") # 取消分组状态,得到普通数据框 sum_people # # A tibble: 3 × 2 # name n # <chr> <dbl> # 1 Bill Evans 1 # 2 Chet Baker 3 # 3 Miles Davis 8
2. 按role和name汇总得到sum_people_role
这个需求只需要在分组时同时指定role和name即可,两种方法的逻辑和上面一致:
方法一:基础R的aggregate()函数
sum_people_role <- aggregate(n ~ role + name, data = people, FUN = sum) sum_people_role # role name n # 1 A Chet Baker 3 # 2 A Miles Davis 3 # 3 B Miles Davis 5 # 4 A Bill Evans 1
方法二:tidyverse风格(dplyr包)
sum_people_role <- people %>% group_by(role, name) %>% # 同时按role和name分组 summarise(n = sum(n), .groups = "drop") sum_people_role # # A tibble: 4 × 3 # role name n # <chr> <chr> <dbl> # 1 A Bill Evans 1 # 2 A Chet Baker 3 # 3 A Miles Davis 3 # 4 B Miles Davis 5
内容的提问来源于stack exchange,提问作者Lucca Ramalho
相关产品推荐
相关产品推荐

