请考虑以下示例数据
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)
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)
| 归档时间: |
|
| 查看次数: |
1431 次 |
| 最近记录: |