在R中创建带有摘要统计的列表,以便输入到摘要_table()中。

问题描述 投票:0回答:1

我正在按照规定的指示 此处 来创建一个干净的汇总统计表。

在这些说明中,summary_table()函数的输入是一个列表,如这里所示。

our_summary1 <-
  list("Miles Per Gallon" =
   list("min" = ~ min(.data$mpg),
        "max" = ~ max(.data$mpg),
        "mean (sd)" = ~ qwraps2::mean_sd(.data$mpg)),
   "Displacement" =
   list("min" = ~ min(.data$disp),
        "median" = ~ median(.data$disp),
        "max" = ~ max(.data$disp),
        "mean (sd)" = ~ qwraps2::mean_sd(.data$disp)),
   "Weight (1000 lbs)" =
   list("min" = ~ min(.data$wt),
        "max" = ~ max(.data$wt),
        "mean (sd)" = ~ qwraps2::mean_sd(.data$wt)),
   "Forward Gears" =
   list("Three" = ~ qwraps2::n_perc0(.data$gear == 3),
        "Four"  = ~ qwraps2::n_perc0(.data$gear == 4),
        "Five"  = ~ qwraps2::n_perc0(.data$gear == 5))
   )

我的数据集中有48个变量,每个变量都有自己的列。有没有一种更干净的方法让我循环浏览我的数据框架中的所有列,以创建一个像上面这样的对象,而不用像这样手动打出来?我最好是使用tidyverse的解决方案。

我正在考虑做的一件事是将我的数据改为长格式,然后使用group_by()对原始数据中的每一列进行分组,然后使用summaryise()。然而,我的理解是,这将产生一个单一的列表,而不是像summary_table()那样需要一个列表的列表。

如果有一种与我在这里试图做的完全不同的方法来创建一个摘要表,请告诉我。这个看起来是我考虑的选项中最整洁的。对于每个变量,我希望能够重新命名它,并包含最小值、最大值、平均值和标准差。

r dplyr apply tidyverse summary
1个回答
3
投票

正如你所注意到的,你可以将你的数据变成一个较长的格式,并使用 summarize(). 诀窍是在每个summary中创建一个列表列。

library(dplyr)
library(tidyr)

summarized <- mtcars %>%
  pivot_longer(cols = c(mpg, wt, disp)) %>%
  group_by(name) %>%
  summarize(lst = list(list(mean = mean(value),
                            max = max(value),
                            min = min(value),
                            sd = sd(value))))

summarized
#> # A tibble: 3 x 2
#>   name  lst             
#> * <chr> <list>          
#> 1 disp  <named list [4]>
#> 2 mpg   <named list [4]>
#> 3 wt    <named list [4]>

然后就可以把它变成一个列表,并在列表中加入 deframe() 从tibble包中获取。

library(tibble)
result <- deframe(summarized)

str(result)
#> List of 3
#>  $ disp:List of 4
#>   ..$ mean: num 231
#>   ..$ max : num 472
#>   ..$ min : num 71.1
#>   ..$ sd  : num 124
#>  $ mpg :List of 4
#>   ..$ mean: num 20.1
#>   ..$ max : num 33.9
#>   ..$ min : num 10.4
#>   ..$ sd  : num 6.03
#>  $ wt  :List of 4
#>   ..$ mean: num 3.22
#>   ..$ max : num 5.42
#>   ..$ min : num 1.51
#>   ..$ sd  : num 0.978

1
投票

David的解决方案不错(已上票)!既然我用lapply快速打出了一个简单的解决方案,这里就给你玩玩。

library(magrittr)
library(qwraps2)
df = data.frame(matrix(rnorm(40), nrow=10))
df

xlist <- function(x)
  { list(
  "min" = min(x),
  "max" = max(x),
  "mean (sd)" = mean_sd(x))}

attach(df)
Smry <- lapply(1:4,FUN=xlist)
Smry

只要在函数中按照你喜欢的方式格式化列表输出就可以了--这里的关键是:1) 建立一个函数& 2) 使用lapply。

© www.soinside.com 2019 - 2024. All rights reserved.