如何用tidyverse函数计算tibble的行与列总计?
嘿,很高兴你已经尝试用gather/spread/join的组合搞定行和列总计啦!作为tidyverse新手,确实有更简洁高效的方法,我给你分享两种常用的方案:
方法1:用janitor包一键搞定(最省心)
janitor是tidyverse生态里专门做数据清洗和格式化的工具包,其中adorn_totals()函数可以直接给你的tibble添加行和列的总计,一步到位,代码超简洁:
先安装并加载janitor(如果还没装的话):
install.packages("janitor") library(janitor) library(tidyverse) # 你的示例数据 df <- tibble(names=c('a','b','c','d','e'),x = 1:5, y =5:1, z=2:6) # 同时添加行总计和列总计 df %>% adorn_totals(where = c("row", "col"))
运行后你会看到:最后一行是所有行的列总计,最后一列是每一行的行总计,连names列的最后一行都会自动显示"Total",完美适配你的需求!
方法2:纯核心tidyverse实现(不用额外装包)
如果不想新增依赖,用dplyr和tidyr的组合也能高效完成,分两步走:
- 先给每行添加行总计
- 计算所有列的总计,再合并到数据框底部
代码示例:
library(tidyverse) df <- tibble(names=c('a','b','c','d','e'),x = 1:5, y =5:1, z=2:6) # 第一步:添加行总计列 df_with_row_totals <- df %>% mutate(row_total = rowSums(across(x:z))) # 这里用across(x:z)选中所有数值列,rowSums计算每行的总和,比手动列名更灵活 # 第二步:计算列总计并合并 df_with_totals <- df_with_row_totals %>% bind_rows( summarize(., names = "Total", across(x:row_total, sum) # 对所有数值列(包括刚加的row_total)求和 ) ) df_with_totals
这种方法用了across()函数来批量处理数值列,不管你有多少个数值列都能轻松搞定,比反复gather/spread要高效得多,尤其是数据量较大的时候。
内容的提问来源于stack exchange,提问作者Mutuelinvestor
相关产品推荐
相关产品推荐

