如何用dplyr的summarise+across将统计结果按变量分行展示?
解决方案:生成按变量分行的统计概览表格
完全可以基于dplyr的现有方法实现,以下两种方案都能得到你期望的2行3列结果:
方案一:基于现有summarise+across结果,重塑数据结构
如果你想保留原有的summarise+across逻辑,只需后续用tidyr::pivot_longer将宽格式结果转为长格式:
library(dplyr) library(tidyr) df <- data.frame( var1 = 1:10, var2 = 11:20 ) VarSum <- df %>% # 原代码生成宽格式统计结果 summarise(across(c(var1, var2), list(n = length, mean = mean, sd = sd))) %>% # 将列名拆分,重塑为按变量分行的结构 pivot_longer( cols = everything(), names_to = c("variable", ".value"), # ".value"指定统计量作为列名 names_sep = "_" # 匹配across默认生成的列名分隔符 ) print(VarSum)
输出结果:
# A tibble: 2 × 4 variable n mean sd <chr> <int> <dbl> <dbl> 1 var1 10 5.5 3.03 2 var2 10 15.5 3.03
方案二:先转长格式再分组统计(更直观)
另一种更直接的思路是先将宽格式数据转为长格式,再按变量分组计算统计量,避免后续的结构转换:
library(dplyr) library(tidyr) df <- data.frame( var1 = 1:10, var2 = 11:20 ) VarSum <- df %>% # 将所有变量转为"变量名-值"的长格式 pivot_longer(everything(), names_to = "variable", values_to = "value") %>% # 按变量分组 group_by(variable) %>% # 计算所需统计量 summarise( n = length(value), mean = mean(value), sd = sd(value) ) %>% # 取消分组(可选,根据后续操作需求) ungroup() print(VarSum)
两种方案都能满足你的需求,你可以根据自己的代码习惯选择。
内容的提问来源于stack exchange,提问作者Kilsen
相关产品推荐
相关产品推荐

