You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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


修复方案

错误原因

  1. 在dplyr::summarise_all的.funs参数中,mean和sd未使用公式语法(~),直接调用函数会把整个数据框作为参数传入,而非按列处理,导致类型不匹配报错。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 12:16:01