【问题标题】:Creating list of lists with summary statistics for input to summary_table() in R在R中为summary_table()的输入创建带有汇总统计的列表列表
【发布时间】:2020-05-03 19:32:26
【问题描述】:

我按照here 中的说明创建一个干净的汇总统计表。

在这些指令中,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() 按原始数据中的每一列进行分组,然后使用 summarise()。但是,我的理解是,这将产生一个列表,而不是像 summary_table() 所必需的列表列表。

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

【问题讨论】:

  • 不会mtcars %&gt;% summarise_at(vars(mpg, disp, wt), list(min = ~ min(.), max = ~ max(.), mean (sd)` = ~mean_sd(.)))` 得到汇总输出

标签: r dplyr apply tidyverse summary


【解决方案1】:

如您所述,您可以将数据转换为更长的格式并使用summarize()。诀窍是在每个汇总中创建一个列表列:

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]>

然后可以将其转换为 tibble 包中带有 deframe() 的列表列表。

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

【讨论】:

    【解决方案2】:

    大卫的好解决方案(赞成)! 由于我使用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-25
      • 2014-02-01
      • 2020-12-03
      • 1970-01-01
      • 2021-12-14
      • 2018-10-30
      相关资源
      最近更新 更多