如何用dplyr为含非数值首列的交叉表添加行与列合计?
实现带行列合计的交叉表
你可以通过在原代码后追加列合计行的方式完成需求,核心是用summarise(across())计算各数值列的合计,再用bind_rows将合计行添加到原表格中:
library(tidyverse) mtcars %>% as.tibble() %>% # 转为tibble格式 mutate(cyl = factor(cyl), gear = factor(gear)) %>% # 将cyl和gear转为因子 select(cyl, gear, mpg) %>% # 选取演示数据列 group_by(cyl, gear) %>% # 按cyl和gear分组 tally() %>% # 计算每组数量 spread(cyl, n) %>% # 转换为交叉表 mutate(RowCount = rowSums(.[ ,-1], na.rm = TRUE)) %>% # 计算行合计 # 新增:计算列合计并追加为新行 bind_rows( summarise(., gear = NA, across(c(`4`, `6`, `8`, RowCount), ~sum(., na.rm = TRUE)) ) )
运行结果:
# A tibble: 4 × 5 gear `4` `6` `8` RowCount <fct> <int> <int> <int> <dbl> 1 3 1 2 12 15 2 4 8 4 NA 12 3 5 2 1 2 5 4 NA 11 7 14 32
关键说明:
across(c(4,6,8, RowCount), ~sum(., na.rm = TRUE)):批量指定需要计算合计的列,通过sum(., na.rm = TRUE)忽略缺失值计算每列的总和bind_rows():将单独计算出的合计行追加到原tibble的末尾- 合计行的
gear列设为NA,满足你的格式需求
内容的提问来源于stack exchange,提问作者Markm0705
相关产品推荐
相关产品推荐

