我正在try 创建一个描述性统计表,为数据帧的每列获取以下统计数据:平均值、标准差、第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

我该如何解决这个问题?

推荐答案

try 一下,修改您的代码以适应现代习语,并将<colname><separator><statistic>习语中的分隔符从"_"更改为".",以避免与您的列名发生冲突(这可能是您错误的根源).

dt %>%
  dplyr::summarise(
    across(
      -id,
      list(
        mean = \(x) mean(x, na.rm = TRUE), 
        sd = \(x) sd(x, na.rm = TRUE), 
        P10 = \(x) quantile(x, 0.1, na.rm = TRUE), 
        P50 = \(x) quantile(x, 0.5, na.rm = TRUE), 
        P90 = \(x) quantile(x, 0.9, na.rm = TRUE)
      ),
      .names = "{.col}.{.fn}"
    ) 
  ) %>%
  pivot_longer(
    everything(), 
    names_sep = "\\.", 
    names_to = c("Variable", "Stat")
  ) %>%
  pivot_wider(names_from = "Stat", values_from = "value") %>%
  mutate(mean = round(mean, 2), sd= round(sd, 2))
# A tibble: 5 × 6
  Variable          mean    sd   P10     P50   P90
  <chr>            <dbl> <dbl> <dbl>   <dbl> <dbl>
1 Numeric_Column_1 -0.04  0.94 -1.20 -0.0872  1.11
2 Numeric_Column_2 -0.15  1.03 -1.46 -0.107   1.07
3 Numeric_Column_3  0.11  1.01 -1.53  0.229   1.14
4 Numeric_Column_4  0.09  1.05 -1.17  0.103   1.53
5 Numeric_Column_5 -0.02  1.02 -1.34 -0.0238  1.38

across呼叫中使用.names无需执行separate步骤.

从长远来看,放弃管道的最后一个元素并用knitr::kable(digits = 2)个元素取代它可能会更好. 这可以在您要求显示时对其进行格式化时保持摘要的内部准确性.

此外,请参阅this page了解为什么应该使用TRUEFALSE而不是TF的解释.

R相关问答推荐

通过绘图 Select 线串几何体并为其着色

使用lapply的重新定位功能

列出用m n个值替换来绘制n个数字的所有方法(i.o.w.:R中大小为n的集合的所有划分为m个不同子集)

在垂直轴中包含多个ggplot2图中的平均值

格点中指数、双曲和反双曲模型曲线的正确绘制

在R中将特定列的值向右移动

将数字转换为分钟和秒

根据元素和前一个值之间的差值过滤矩阵的元素

基于R中的间隔扩展数据集行

按时间顺序对不同事件进行分组

从非重叠(非滚动)周期中的最新数据向后开窗并在周期内计数

KM估计的差异:SvyKm与带权重的调查

R -基线图-图形周围的阴影区域

访问数据帧中未定义的列时出现R错误

是否有一个R函数可以输出在输入的字符向量中找到的相应正则表达式模式?

TidyVerse中长度不等的列结合向量

需要一个函数来在第一行创建一个新变量,然后用新变量替换一个不同的变量(对于多行)

如何使用ggplot2根据绘图中生成的斜率对小平面进行排序?

图中显示错误 colored颜色 的图例geom_sf

在一个multiplot中以非对称的方式在R中绘制多个图