do/tidy 从 dplyr 和 broom 返回的绑定列未按预期工作
bind columns returned by do/tidy from dplyr and broom not working as expected
我正在尝试使用 dplyr
中的 do
和 broom
中的 tidy
将一些内容整齐地组织到数据框中。一切正常。但是,现在我正在尝试根据同一管道内的分组来改变一个值,但我无法让它为我想要的工作:
示例(使用 mtcars
数据集):
library(dplyr)
library(broom)
mtcars %>% group_by(cyl) %>% mutate(n = n()) %>% do(tidy(summary(.$mpg)))
我希望得到每个柱体 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))))
但是,寻找单管道解决方案(如果可能的话)。
在do
中使用bind_cols
mtcars %>% group_by(cyl) %>%
mutate(n = n()) %>%
do(bind_cols(tidy(summary(.$mpg)),
data.frame(unique(.$n)) ))
或(首选选项)使用n
作为分组变量(由@Frank提供):
mtcars %>% group_by(cyl) %>%
group_by(n = n(), add=T) %>%
do(tidy(summary(.$mpg)))
两者都给出:
Source: local data frame [3 x 8]
Groups: cyl, n [3]
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
我担心惯用的方式是
my_summary = function(x) as.data.frame(as.list(c(n = length(x), summary(x))))
mtcars %>% group_by(cyl) %>% do(my_summary(.$mpg))
cyl n Min. X1st.Qu. Median Mean X3rd.Qu. Max.
(dbl) (dbl) (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
(我对 broom
不够熟悉,无法使用它编写 my_summary
。)
我正在尝试使用 dplyr
中的 do
和 broom
中的 tidy
将一些内容整齐地组织到数据框中。一切正常。但是,现在我正在尝试根据同一管道内的分组来改变一个值,但我无法让它为我想要的工作:
示例(使用 mtcars
数据集):
library(dplyr)
library(broom)
mtcars %>% group_by(cyl) %>% mutate(n = n()) %>% do(tidy(summary(.$mpg)))
我希望得到每个柱体 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))))
但是,寻找单管道解决方案(如果可能的话)。
在do
bind_cols
mtcars %>% group_by(cyl) %>%
mutate(n = n()) %>%
do(bind_cols(tidy(summary(.$mpg)),
data.frame(unique(.$n)) ))
或(首选选项)使用n
作为分组变量(由@Frank提供):
mtcars %>% group_by(cyl) %>%
group_by(n = n(), add=T) %>%
do(tidy(summary(.$mpg)))
两者都给出:
Source: local data frame [3 x 8]
Groups: cyl, n [3]
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
我担心惯用的方式是
my_summary = function(x) as.data.frame(as.list(c(n = length(x), summary(x))))
mtcars %>% group_by(cyl) %>% do(my_summary(.$mpg))
cyl n Min. X1st.Qu. Median Mean X3rd.Qu. Max.
(dbl) (dbl) (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
(我对 broom
不够熟悉,无法使用它编写 my_summary
。)