dplyr-esque 方法来执行分组和未分组的汇总操作
dplyr-esque way to perform summary operations both grouped and ungrouped
我希望能够多次使用 dplyr
对一组数据执行相同的操作。每次我执行该操作时,我都希望有一组不同的列,我 group_by()
。我如何以最 dplyr 式的方式执行此操作(最佳情况下,无需复制和粘贴代码或创建单独的中间对象):
library(dplyr)
mtcars %>%
group_by(cyl, gear) %>%
summarise(`Mean mpg` = mean(mpg),
`Mean hp` = mean(hp))
mtcars %>%
group_by(cyl) %>%
summarise(`Mean mpg` = mean(mpg),
`Mean hp` = mean(hp))
就像某些上下文一样,虽然这是一个简单的示例,但我更感兴趣的是将它的使用扩展到我可能 运行 需要更长的函数管道的实例,例如 运行 分层和未分层数据的逻辑回归模型......但这超出了问题的范围。
如果 w 不知道组数,那么一种选择是使用 ...
(假设获得 mean
的变量是相同的
f1 <- function(dat, ...){
dat %>%
group_by_at(vars(...)) %>%
summarise_at(vars('mpg', 'hp'), funs(Mean = mean(.)))
}
f1(mtcars, 'cyl', 'gear')
# cyl gear mpg_Mean hp_Mean
# <dbl> <dbl> <dbl> <dbl>
#1 4 3 21.500 97.0000
#2 4 4 26.925 76.0000
#3 4 5 28.200 102.0000
#4 6 3 19.750 107.5000
#5 6 4 19.750 116.5000
#6 6 5 19.700 175.0000
#7 8 3 15.050 194.1667
#8 8 5 15.400 299.5000
f1(mtcars, 'cyl')
# A tibble: 3 x 3
# cyl mpg_Mean hp_Mean
# <dbl> <dbl> <dbl>
#1 4 26.66364 82.63636
#2 6 19.74286 122.28571
#3 8 15.10000 209.21429
同样,虽然上面提出的问题可能有很多解决方案,但我正在寻找更优雅的方法来解决 this/wondered 如果 dplyr 中内置了一些我没有注意到的方法.
另一种可能的解决方案如下:
mtcars.2 <- mtcars %>%
mutate(gear = as.character(gear))
mtcars.2 <- bind_rows(mtcars.2,
mtcars.2 %>%
mutate(gear = "All gears"))
mtcars.2 %>%
group_by(cyl, gear) %>%
summarise(`Mean mpg` = mean(mpg),
`Mean hp` = mean(hp))
我希望能够多次使用 dplyr
对一组数据执行相同的操作。每次我执行该操作时,我都希望有一组不同的列,我 group_by()
。我如何以最 dplyr 式的方式执行此操作(最佳情况下,无需复制和粘贴代码或创建单独的中间对象):
library(dplyr)
mtcars %>%
group_by(cyl, gear) %>%
summarise(`Mean mpg` = mean(mpg),
`Mean hp` = mean(hp))
mtcars %>%
group_by(cyl) %>%
summarise(`Mean mpg` = mean(mpg),
`Mean hp` = mean(hp))
就像某些上下文一样,虽然这是一个简单的示例,但我更感兴趣的是将它的使用扩展到我可能 运行 需要更长的函数管道的实例,例如 运行 分层和未分层数据的逻辑回归模型......但这超出了问题的范围。
如果 w 不知道组数,那么一种选择是使用 ...
(假设获得 mean
的变量是相同的
f1 <- function(dat, ...){
dat %>%
group_by_at(vars(...)) %>%
summarise_at(vars('mpg', 'hp'), funs(Mean = mean(.)))
}
f1(mtcars, 'cyl', 'gear')
# cyl gear mpg_Mean hp_Mean
# <dbl> <dbl> <dbl> <dbl>
#1 4 3 21.500 97.0000
#2 4 4 26.925 76.0000
#3 4 5 28.200 102.0000
#4 6 3 19.750 107.5000
#5 6 4 19.750 116.5000
#6 6 5 19.700 175.0000
#7 8 3 15.050 194.1667
#8 8 5 15.400 299.5000
f1(mtcars, 'cyl')
# A tibble: 3 x 3
# cyl mpg_Mean hp_Mean
# <dbl> <dbl> <dbl>
#1 4 26.66364 82.63636
#2 6 19.74286 122.28571
#3 8 15.10000 209.21429
同样,虽然上面提出的问题可能有很多解决方案,但我正在寻找更优雅的方法来解决 this/wondered 如果 dplyr 中内置了一些我没有注意到的方法.
另一种可能的解决方案如下:
mtcars.2 <- mtcars %>%
mutate(gear = as.character(gear))
mtcars.2 <- bind_rows(mtcars.2,
mtcars.2 %>%
mutate(gear = "All gears"))
mtcars.2 %>%
group_by(cyl, gear) %>%
summarise(`Mean mpg` = mean(mpg),
`Mean hp` = mean(hp))