我想实现一个函数,它与 dplyr 中的 filter 方法具有相同的接口,但不是删除与条件不匹配的行,而是返回一个带有指示变量的数组,或者将此类列附加到返回的 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