在 R 中为输入 summary_table() 创建带有摘要统计信息的列表列表
Creating list of lists with summary statistics for input to summary_table() in R
我正在按照 here 的说明创建一个干净的 table 汇总统计信息。
在这些指令中,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() 所必需的列表列表。
如果创建摘要的方法 table 与我在这里尝试做的完全不同,请告诉我。这个看起来是我正在考虑的选项中最简洁的。对于每个变量,我希望能够重命名它并包括最小值、最大值、平均值和标准差。
如您所述,您可以将数据转换为更长的格式并使用 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
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
我正在按照 here 的说明创建一个干净的 table 汇总统计信息。
在这些指令中,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() 所必需的列表列表。
如果创建摘要的方法 table 与我在这里尝试做的完全不同,请告诉我。这个看起来是我正在考虑的选项中最简洁的。对于每个变量,我希望能够重命名它并包括最小值、最大值、平均值和标准差。
如您所述,您可以将数据转换为更长的格式并使用 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
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