dplyr - 多个变量的汇总表

pal*_*czy 10 r dplyr

如何使用dplyr多个变量创建简单的摘要统计?使用该summarise_each函数似乎是要走的路,但是,当将多个函数应用于多个列时,结果是一个宽的,难以读取的数据帧.

pal*_*czy 30

使用dplyr结合tidyr来重塑最终结果.

library(dplyr)
library(tidyr)

df <- tbl_df(mtcars)

df.sum <- df %>%
  select(mpg, cyl, vs, am, gear, carb) %>% # select variables to summarise
  summarise_each(funs(min = min, 
                      q25 = quantile(., 0.25), 
                      median = median, 
                      q75 = quantile(., 0.75), 
                      max = max,
                      mean = mean, 
                      sd = sd))

# the result is a wide data frame
> dim(df.sum)
[1]  1 42

# reshape it using tidyr functions

df.stats.tidy <- df.sum %>% gather(stat, val) %>%
  separate(stat, into = c("var", "stat"), sep = "_") %>%
  spread(stat, val) %>%
  select(var, min, q25, median, q75, max, mean, sd) # reorder columns

> print(df.stats.tidy)

   var  min    q25 median  q75  max     mean        sd
1   am  0.0  0.000    0.0  1.0  1.0  0.40625 0.4989909
2 carb  1.0  2.000    2.0  4.0  8.0  2.81250 1.6152000
3  cyl  4.0  4.000    6.0  8.0  8.0  6.18750 1.7859216
4 gear  3.0  3.000    4.0  4.0  5.0  3.68750 0.7378041
5  mpg 10.4 15.425   19.2 22.8 33.9 20.09062 6.0269481
6   vs  0.0  0.000    0.0  1.0  1.0  0.43750 0.5040161
Run Code Online (Sandbox Code Playgroud)

  • 现在使用 `summarise_each` 会抛出一个警告,指出它已被弃用,并且 `summarise_all` 是这种用例的新函数。dplyr 0.7.8 (3认同)
  • 不仅 `summarise_all` 被弃用,而且 `funs` 也被弃用,因此它需要看起来像 `summarise(across(varlist, list(min = min, q25 = ~quantile(., 0.25),median = middle, q75 = ~ quantile(., 0.75), max = max, Mean = Mean, sd = sd)))` 使用 `~` 语句。尽管如此,下面的@konrad 解决方案甚至比这更好。 (3认同)
  • 我喜欢这种解决方案而不是观星者解决方案,因为它返回一个data.frame,然后可以进一步使用它。但不幸的是,我遇到了问题,因为我的变量名中带有下划线,这使琵琶的单独步骤变得异常。我一直在寻找是否split具有仅使用最右边的下划线的参数,但没有运气。关于如何对此进行一般化的任何建议,以免引起下划线变量的阻塞? (2认同)

Kon*_*rad 15

可以使用broom::tidy和创建一个潜在的简单解决方案purrr::map_dfbroom::tidy将统计输出中的关键对象汇总到一个小标题中。purrr::map_df将函数应用于每个元素,在这种情况下是一列并返回一个小标题。

例子

library(tidyverse)
mtcars %>% 
    select(mpg, cyl, vs, am, gear, carb) %>% 
    map_df(.f = ~ broom::tidy(summary(.x)), .id = "variable")
Run Code Online (Sandbox Code Playgroud)

结果

# A tibble: 6 x 7
# variable minimum    q1 median   mean    q3 maximum
# <chr>      <dbl> <dbl>  <dbl>  <dbl> <dbl>   <dbl>
# 1 mpg         10.4  15.4   19.2 20.1    22.8    33.9
# 2 cyl          4     4      6    6.19    8       8  
# 3 vs           0     0      0    0.438   1       1  
# 4 am           0     0      0    0.406   1       1  
# 5 gear         3     3      4    3.69    4       5  
# 6 carb         1     2      2    2.81    4       8  
Run Code Online (Sandbox Code Playgroud)

  • 非常好的解决方案。 (3认同)
  • @Matthew你可以通过多种方式做到这一点,如果你想在该步骤中打包更多转换,创建自己版本的“summary”函数可能看起来很干净。仅应用这些函数 [`across`](https://dplyr.tidyverse.org/reference/across.html) 可能会提供最干净的解决方案。您可能希望做一些事情:`summarise(across(starts_with("Sepal"), list(mean = Mean, sd = sd)))`反映您的功能,如提供的示例中所示。Dplyr 的“n”不接受任何参数,因此您必须使用不同的方法导出计数或包装“n”以删除参数。 (3认同)

Mag*_*nus 10

我喜欢paljenczy的想法,即只使用dplyr/tidy并在格式化之前在data.frame/tibble中获取表.但是我遇到了健壮性问题:因为它依赖于解析变量名称,所以它在名称中带有下划线的列上会被阻塞.在尝试在dplyr框架中修复它之后,它似乎总是有些脆弱,因为它依赖于字符串解析.

所以最后我决定使用psych :: describe()这是一个专门为这个东西设计的函数.它不完全是任意函数,但几乎任何人都想要做的事情.完整的示例复制下面的解决方案(将描述与一些整齐的东西结合起来得到我正在寻找的确切元素):

library(psych)
library(tidyverse)

# Create an extended version with a bunch of stats 
d.summary.extended <- mtcars %>%
    select(mpg, cyl, vs, am, gear, carb) %>%
    psych::describe(quant=c(.25,.75)) %>%
    as_tibble(rownames="rowname")  %>%
    print()

<OUTPUT>
# A tibble: 6 x 16
  rowname  vars     n     mean        sd median    trimmed     mad   min   max range       skew  kurtosis         se  Q0.25 Q0.75
    <chr> <int> <dbl>    <dbl>     <dbl>  <dbl>      <dbl>   <dbl> <dbl> <dbl> <dbl>      <dbl>     <dbl>      <dbl>  <dbl> <dbl>
1     mpg     1    32 20.09062 6.0269481   19.2 19.6961538 5.41149  10.4  33.9  23.5  0.6106550 -0.372766 1.06542396 15.425  22.8
2     cyl     2    32  6.18750 1.7859216    6.0  6.2307692 2.96520   4.0   8.0   4.0 -0.1746119 -1.762120 0.31570933  4.000   8.0
3      vs     3    32  0.43750 0.5040161    0.0  0.4230769 0.00000   0.0   1.0   1.0  0.2402577 -2.001938 0.08909831  0.000   1.0
4      am     4    32  0.40625 0.4989909    0.0  0.3846154 0.00000   0.0   1.0   1.0  0.3640159 -1.924741 0.08820997  0.000   1.0
5    gear     5    32  3.68750 0.7378041    4.0  3.6153846 1.48260   3.0   5.0   2.0  0.5288545 -1.069751 0.13042656  3.000   4.0
6    carb     6    32  2.81250 1.6152000    2.0  2.6538462 1.48260   1.0   8.0   7.0  1.0508738  1.257043 0.28552971  2.000   4.0
</OUTPUT>

# Select stats for comparison with other solutions
d.summary <- d.summary.extended %>%
    select(var=rowname, min, q25=Q0.25, median, q75=Q0.75, max, mean, sd) %>%
    print()

<OUTPUT>
# A tibble: 6 x 8
    var   min    q25 median   q75   max     mean        sd
  <chr> <dbl>  <dbl>  <dbl> <dbl> <dbl>    <dbl>     <dbl>
1   mpg  10.4 15.425   19.2  22.8  33.9 20.09062 6.0269481
2   cyl   4.0  4.000    6.0   8.0   8.0  6.18750 1.7859216
3    vs   0.0  0.000    0.0   1.0   1.0  0.43750 0.5040161
4    am   0.0  0.000    0.0   1.0   1.0  0.40625 0.4989909
5  gear   3.0  3.000    4.0   4.0   5.0  3.68750 0.7378041
6  carb   1.0  2.000    2.0   4.0   8.0  2.81250 1.6152000    
</OUTPUT>
Run Code Online (Sandbox Code Playgroud)


jan*_*nyi 8

如果你想创建一个发表的摘要表(不是为了进一步的计算),你可能想看看优秀的观星者包.

df <- data.frame(mtcars)
cols <- c('mpg', 'cyl', 'vs', 'am', 'gear', 'carb')
stargazer(
    df[, cols], type = "text", 
    summary.stat = c("min", "p25", "median", "p75", "max", "median", "sd")
)

================================================================
Statistic  Min   Pctl(25) Median Pctl(75)  Max   Median St. Dev.
----------------------------------------------------------------
mpg       10.400  15.430  19.200  22.800  33.900 19.200  6.027
cyl         4       4       6       8       8      6     1.786
vs          0       0       0       1       1      0     0.504
am          0       0       0       1       1      0     0.499
gear        3       3       4       4       5      4     0.738
carb        1       2       2       4       8      2     1.615
----------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

您也可以将类型更改为"latex"和"html",并将其保存到文件中,并指定给出"out"参数的文件.