使用dplyr(或其他方式)将包含列表的数据框列拆分为多个列

Ale*_*lex 7 r dplyr

请考虑以下示例数据

library(dplyr)
tmp <- mtcars %>%
    group_by(cyl) %>%
    summarise(mpg_sum = list(summary(mpg)))
Run Code Online (Sandbox Code Playgroud)

这样mpg_sum包含mpg变量的最小值,第一个四分位数,中位数,平均值,第三个四分位数和最大值cyl.

如何使用dplyr或其他方法将此列拆分为具有适当列名的6列?

akr*_*run 12

我们可以用data.table.将'data.frame'转换为'data.table'(as.data.table(mtcars)),按'cyl'分组,我们得到summary'mpg'并将其转换为list

library(data.table)
as.data.table(mtcars)[, as.list(summary(mpg)), by = cyl]
#    cyl Min. 1st Qu. Median  Mean 3rd Qu. Max.
#1:   6 17.8   18.65   19.7 19.74   21.00 21.4
#2:   4 21.4   22.80   26.0 26.66   30.40 33.9
#3:   8 10.4   14.40   15.2 15.10   16.25 19.2
Run Code Online (Sandbox Code Playgroud)

或者 使用dplyr,在通过'cyl'分组后,我们使用do与上面相同的操作.

library(dplyr)
mtcars %>%
     group_by(cyl) %>%
     do(data.frame(as.list(summary(.$mpg)), check.names=FALSE) )
#   cyl  Min. 1st Qu. Median  Mean 3rd Qu.  Max.
#  <dbl> <dbl>   <dbl>  <dbl> <dbl>   <dbl> <dbl>
#1     4  21.4   22.80   26.0 26.66   30.40  33.9
#2     6  17.8   18.65   19.7 19.74   21.00  21.4
#3     8  10.4   14.40   15.2 15.10   16.25  19.2
Run Code Online (Sandbox Code Playgroud)

或使用 purrr

library(purrr)
mtcars %>% 
     slice_rows("cyl") %>% 
     select(mpg) %>%
     by_slice(dmap, summary, .collate= "cols")
Run Code Online (Sandbox Code Playgroud)

  • 这看起来非常好......来自`data.table`的自动命名要好得多,因为你不必指定check.names (3认同)

tal*_*lat 10

如评论,您还可以使用tidy包中的功能broom:

library(broom)
mtcars %>% group_by(cyl) %>% do(tidy(summary(.$mpg)))
# Source: local data frame [3 x 7]
# Groups: cyl [3]
# 
#     cyl minimum    q1 median  mean    q3 maximum
#   (dbl)   (dbl) (dbl)  (dbl) (dbl) (dbl)   (dbl)
# 1     4    21.4 22.80   26.0 26.66 30.40    33.9
# 2     6    17.8 18.65   19.7 19.74 21.00    21.4
# 3     8    10.4 14.40   15.2 15.10 16.25    19.2
Run Code Online (Sandbox Code Playgroud)