提问者:小点点

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


考虑以下示例数据

library(dplyr)
tmp <- mtcars %>%
    group_by(cyl) %>%
    summarise(mpg_sum = list(summary(mpg)))

这样mpg_sum包含mpg变量的最小值、1分位值、中位数、平均值、3分位值和最大值。

如何使用dplyr或其他方式将此列解压缩为具有适当列名的6列?


共3个答案

匿名用户

我们可以使用data. table。将'data.frame'转换为'data.table'(as.data.table(mtcar)),按'cyl'分组,我们得到'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

或者仅使用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

或者使用purrr

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

匿名用户

如评论所示,您还可以使用包broom中的tidy函数:

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

匿名用户

另一种选择

with(data = mtcars,by(mpg,cyl,FUN = summary))