使用dplyr summarise_all生成描述统计表格时遇类型转换错误求助
问题描述
想要为数据框生成描述统计表格,包含每列的均值(mean)、标准差(sd)、10分位数、50分位数和90分位数,最终转置数据集,让列对应统计量、每行对应一个变量。
示例数据集:
dt <- data.frame(id = 1:100, Numeric_Column_1 = rnorm(100), Numeric_Column_2 = rnorm(100), Numeric_Column_3 = rnorm(100), Numeric_Column_4 = rnorm(100), Numeric_Column_5 = rnorm(100))
使用的代码:
desc_table <- dt %>% select(-id) %>% dplyr::summarise_all(.funs = list(mean=mean(.,na.rm=T), sd=sd(.,na.rm=T), P10=~quantile(., c(0.1), na.rm=T), P50=~quantile(., c(0.5), na.rm=T), P90=~quantile(., c(0.9), na.rm=T)), na.rm=TRUE) %>% pivot_longer(cols = everything()) %>% separate(name,c("Variable", "Stat"),sep = "_") %>% pivot_wider(names_from = "Stat", values_from = "value") %>% mutate(mean = round(mean, 2), sd= round(sd, 2))
运行时出现错误:
Error in is.data.frame(x):
'list' object cannot be coerced to type 'double'
In addition: Warning message:
In mean.default (., na.rm = T):
argument is not numeric or logical: returning NA
修复方案
错误原因
- 在
dplyr::summarise_all的.funs参数中,mean和sd未使用公式语法(~),直接调用函数会把整个数据框作为参数传入,而非按列处理,导致类型不匹配报错。 separate步骤用sep="_"会错误拆分带下划线的变量名(比如Numeric_Column_1_mean会被拆成多段),无法正确提取变量名和统计量。
修正后的代码
library(dplyr) library(tidyr) desc_table <- dt %>% select(-id) %>% # 所有统计函数统一使用公式语法,确保按列处理 summarise_all(.funs = list( mean = ~mean(., na.rm = TRUE), sd = ~sd(., na.rm = TRUE), P10 = ~quantile(., 0.1, na.rm = TRUE), P50 = ~quantile(., 0.5, na.rm = TRUE), P90 = ~quantile(., 0.9, na.rm = TRUE) )) %>% pivot_longer(cols = everything()) %>% # 用正则匹配最后一个下划线,避免拆分变量名内部的下划线 separate(name, into = c("Variable", "Stat"), sep = "_(?=[^_]+$)") %>% pivot_wider(names_from = "Stat", values_from = "value") %>% # 用across简化多列的四舍五入操作 mutate(across(c(mean, sd), ~round(., 2)))
关键调整说明
- 统一公式语法:所有统计函数都用
~函数名(...),确保summarise_all逐列处理变量; - 优化分隔规则:
_(?=[^_]+$)仅分割变量名与统计量之间的最后一个下划线,保留原始变量名的完整性; - 简化四舍五入:用
across批量处理mean和sd列的四舍五入,代码更简洁。
内容的提问来源于stack exchange,提问作者Vincenzoalfano
相关产品推荐
相关产品推荐

