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

时间:2016-07-04 06:10:45

标签: r dplyr

考虑以下示例数据

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

这样mpg_sum包含mpg中各组的cyl变量的最小值,第1四分位数,中位数,平均值,第3个四分位数和最大值。

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

4 个答案:

答案 0 :(得分:12)

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

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 ,在按'cyl'分组后,我们使用dplyr执行与上述相同的操作。

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

答案 1 :(得分: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

答案 2 :(得分:4)

(或其他)选项使用sapply()

t(sapply(split(mtcars$mpg, mtcars$cyl), summary))

答案 3 :(得分:4)

另一个选择

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