R tidyverse技术问题:如何为统计表格添加列汇总行
解决方案
修复后的函数代码
library(tidyverse) count_demo <- function(data, filter_expr) { # 生成带行汇总的交叉计数宽表 result <- data %>% filter({{ filter_expr }}) %>% count(gender, race, name = "count") %>% pivot_wider(names_from = race, values_from = count, values_fill = 0) %>% mutate(Total = rowSums(pick(-gender))) # 计算列汇总并构造总行 total_row <- result %>% summarise( gender = "Total", across(everything(), ~sum(.x)) ) # 合并原表与汇总行 bind_rows(result, total_row) }
示例使用
# 构造测试数据 sample_data <- tibble( gender = rep(c("Male", "Female"), each = 5), race = sample(c("White", "Black", "Asian"), 10, replace = TRUE) ) # 无筛选调用 count_demo(sample_data, TRUE) # 带筛选条件调用 count_demo(sample_data, gender == "Male")
错误原因说明
你之前在add_row中使用pick()触发报错,核心原因是pick()必须在数据掩码上下文(如mutate()、summarise()这类能识别数据框列的函数)中运行,而add_row()是直接构造行数据,不属于该环境,无法解析pick()引用的列。
改用summarise()计算列总和,是在数据框的原生上下文里操作,能正确遍历所有列,再通过bind_rows()合并,即可避免该问题。
示例输出
# A tibble: 3 × 5 gender White Black Asian Total <chr> <int> <int> <int> <dbl> 1 Male 2 1 1 4 2 Female 1 2 1 4 3 Total 3 3 2 8
内容的提问来源于stack exchange,提问作者OnlyDean
相关产品推荐
相关产品推荐

