【发布时间】:2016-05-24 21:26:57
【问题描述】:
我正在尝试使用来自dplyr 的do 和来自broom 的tidy 将一些东西整齐地组织到一个数据框中。一切正常。但是,现在我正在尝试根据同一管道内的分组来改变一个值,但我无法让它为我想要的工作:
示例(带有mtcars 数据集):
library(dplyr)
library(broom)
mtcars %>% group_by(cyl) %>% mutate(n = n()) %>% do(tidy(summary(.$mpg)))
我希望得到每个 cyl 的 summary 的输出以及我在中间计算的观察次数。但是,我只得到summary 的输出如下:
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
输出值n 丢失。
我也尝试了bind_cols和inner_join如下,都导致如下所示的错误:
mtcars %>% group_by(cyl) %>% mutate(mpgMean = mean(mpg)) %>% inner_join(., do(tidy(summary(.$mpg))))
Error in args[[1]] : subscript out of bounds
mtcars %>% group_by(cyl) %>% mutate(n = n()) %>% bind_cols(do(tidy(summary(.$mpg))))
Error in args[[1]] : subscript out of bounds
知道我怎样才能完成这项工作吗?
我的预期输出是:
Joining by: "cyl"
Source: local data frame [3 x 8]
cyl n minimum q1 median mean q3 maximum
<dbl> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 4 11 21.4 22.80 26.0 26.66 30.40 33.9
2 6 7 17.8 18.65 19.7 19.74 21.00 21.4
3 8 14 10.4 14.40 15.2 15.10 16.25 19.2
当然,这样做我可以得到这个结果:
inner_join(count(mtcars, cyl), mtcars %>% group_by(cyl) %>% do(tidy(summary(.$mpg))))
但是,寻找单管解决方案(如果可能的话)。
【问题讨论】:
-
或者简单地说:
mtcars %>% group_by(cyl) %>% mutate(n = n()) %>% group_by(cyl,n) %>% do(tidy(summary(.$mpg))) -
肯定更好...仍然希望有一种方法可以获取
do的输出和列绑定。?do确实说它返回一个数据框。 -
带data.table:
as.data.table(mtcars)[, c(.(n = .N), as.list(summary(mpg))), by=cyl]