如何使用dplyr自动对多列进行分组求和并合并到同一数据集?
当然有更高效的自动化方法!不用手动给每一列重复写分组求和的代码,用dplyr的几个函数就能一次性搞定所有列的求和,还能直接把结果合并到同一个数据集中,省超多时间~
方法一:使用
across()(dplyr 1.0.0+ 推荐用法) 这是dplyr新版本主推的函数,灵活性很强。你可以直接指定要计算的列范围(比如前四列),然后在across()里应用sum()函数,还能自定义结果列的命名:
library(dplyr) # 对iris数据集的前4列,按Species分组求和 abc_all <- iris %>% group_by(Species) %>% summarise( across(1:4, sum, .names = "sum_{.col}") # .names参数用来给新列命名,{.col}会替换成原列名 ) %>% ungroup() # 查看结果 print(abc_all)
如果不想用列的位置索引,也可以直接指定列名向量,比如:
across(c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width"), sum, .names = "sum_{.col}")
方法二:使用
summarise_at()(兼容旧版dplyr) 如果你的dplyr版本低于1.0.0,用summarise_at()也能实现同样的效果:
abc_all <- iris %>% group_by(Species) %>% summarise_at(vars(1:4), sum) %>% # vars(1:4)指定要操作的列,同样可以换成具体列名 ungroup()
要是想给结果列加自定义后缀,比如_sum,可以用funs()(不过这个写法在新版dplyr里已经被across()替代了):
abc_all <- iris %>% group_by(Species) %>% summarise_at(vars(1:4), funs(sum = sum)) %>% ungroup()
用上面任意一种方法,最终都会得到一个包含Species列和所有目标列求和结果的数据框,不用再单独生成多个数据集然后手动合并啦~
内容的提问来源于stack exchange,提问作者Inuraghe
相关产品推荐
相关产品推荐

