如何编写与 dplyr::filter 接口相同但功能不同的函数
How to write a function with same interface as dplyr::filter but which is doing something different
我想实现一个函数,它与 dplyr 中的过滤器方法具有相同的接口,但不是删除不符合条件的行,例如,return 一个带有指示变量的数组,或将此类专栏附加到 returned tibble?
我会发现它非常有用,因为它可以让我计算过滤前后某些列的摘要以及本应在单个小标题上删除的行的摘要。
我觉得dplyr::filter界面很方便,所以想效仿一下。
我想group_by
会在这里帮助你
您通常可以这样筛选然后汇总
library(dplyr)
mtcars %>%
filter(cyl==4) %>%
summarise(mean=mean(gear))
# mean
# 1 4.090909
您可以group_by
,总结,然后过滤
mtcars %>%
group_by(cyl) %>%
summarise(mean=mean(gear))
# optional filter here
# # A tibble: 3 x 2
# cyl mean
# <dbl> <dbl>
# 1 4 4.090909
# 2 6 3.857143
# 3 8 3.285714
您也可以按条件分组,就像这样
mtcars %>%
group_by(cyl > 4) %>%
summarise(mean=mean(gear))
# # A tibble: 2 x 2
# `cyl > 4` mean
# <lgl> <dbl>
# 1 FALSE 4.090909
# 2 TRUE 3.476190
您需要 quo
和 !!
(或 UQ()
)。请参阅以下示例:
df <- tibble(
g1 = c(1, 1, 2, 2, 2),
g2 = c(1, 2, 1, 2, 1),
a = sample(5),
b = sample(5)
)
my_summarise <- function(df, group_by) {
quo_group_by <- quo(group_by)
print(quo_group_by)
df %>%
group_by(!!quo_group_by) %>%
summarise(a = mean(a))
}
my_summarise(df, g1)
有关更多示例和讨论,请参阅 http://dplyr.tidyverse.org/articles/programming.html
我想实现一个函数,它与 dplyr 中的过滤器方法具有相同的接口,但不是删除不符合条件的行,例如,return 一个带有指示变量的数组,或将此类专栏附加到 returned tibble?
我会发现它非常有用,因为它可以让我计算过滤前后某些列的摘要以及本应在单个小标题上删除的行的摘要。
我觉得dplyr::filter界面很方便,所以想效仿一下。
我想group_by
会在这里帮助你
您通常可以这样筛选然后汇总
library(dplyr)
mtcars %>%
filter(cyl==4) %>%
summarise(mean=mean(gear))
# mean
# 1 4.090909
您可以group_by
,总结,然后过滤
mtcars %>%
group_by(cyl) %>%
summarise(mean=mean(gear))
# optional filter here
# # A tibble: 3 x 2
# cyl mean
# <dbl> <dbl>
# 1 4 4.090909
# 2 6 3.857143
# 3 8 3.285714
您也可以按条件分组,就像这样
mtcars %>%
group_by(cyl > 4) %>%
summarise(mean=mean(gear))
# # A tibble: 2 x 2
# `cyl > 4` mean
# <lgl> <dbl>
# 1 FALSE 4.090909
# 2 TRUE 3.476190
您需要 quo
和 !!
(或 UQ()
)。请参阅以下示例:
df <- tibble(
g1 = c(1, 1, 2, 2, 2),
g2 = c(1, 2, 1, 2, 1),
a = sample(5),
b = sample(5)
)
my_summarise <- function(df, group_by) {
quo_group_by <- quo(group_by)
print(quo_group_by)
df %>%
group_by(!!quo_group_by) %>%
summarise(a = mean(a))
}
my_summarise(df, g1)
有关更多示例和讨论,请参阅 http://dplyr.tidyverse.org/articles/programming.html