R lazyeval:将参数传递给dplyr::filter
R lazyeval: pass parameters to dplyr::filter
我认为这个问题有多种其他变体(例如:, and perhaps here)- 甚至可能在某处有答案。
如何给过滤函数提供参数。
library(dplyr)
library(lazyeval)
set.seed(10)
data <- data.frame(a=sample(1:10, 100, T))
如果我需要计算数字 1 到 10 出现的次数并显示 1、2 和 3 的计数,我会这样做:
data %>%
group_by(a) %>%
summarise(n = n()) %>%
filter(a < 4)
给出:
# A tibble: 3 × 2
a n
<int> <int>
1 1 11
2 2 8
3 3 16
现在,我如何将其放入函数中?
这里 grp
是分组变量。
fun <- function(d, grp, no){
d %>%
group_by_(grp) %>%
summarise_(n = interp(~ n() )) %>%
filter_( grp < no)
# This final line instead also does not work:
# filter_(interp( grp < no), grp = as.name(grp))
}
现在,
fun(data, 'a', 4)
给出:
# A tibble: 0 × 2
# ... with 2 variables: a <int>, n <int>
我们可以使用 dplyr
开发版本(即将发布 0.6.0)
中的 quosures 方法
fun <- function(d, grp, no){
grp <- enquo(grp)
d %>%
group_by(UQ(grp)) %>%
summarise(n = n() )%>%
filter(UQ(grp) < no)
}
fun(data, a, 4)
# A tibble: 3 x 2
# a n
# <int> <int>
#1 1 11
#2 2 8
#3 3 16
我们使用enquo
获取输入参数并将其转换为quosure
,在group_by/summarise/mutate
中,通过取消引号(UQ
或!!
)
上面的函数也可以修改为同时接受带引号和不带引号的参数
fun <- function(d, grp, no){
lst <- as.list(match.call())
grp <- if(is.character(lst$grp)) {
rlang::parse_quosure(grp)
} else enquo(grp)
d %>%
group_by(UQ(grp)) %>%
summarise(n = n() )%>%
filter(UQ(grp) < no)
}
fun(data, a, 4)
# A tibble: 3 x 2
# a n
# <int> <int>
#1 1 11
#2 2 8
#3 3 16
fun(data, 'a', 4)
# A tibble: 3 x 2
# a n
# <int> <int>
#1 1 11
#2 2 8
#3 3 16
我认为这个问题有多种其他变体(例如:
如何给过滤函数提供参数。
library(dplyr)
library(lazyeval)
set.seed(10)
data <- data.frame(a=sample(1:10, 100, T))
如果我需要计算数字 1 到 10 出现的次数并显示 1、2 和 3 的计数,我会这样做:
data %>%
group_by(a) %>%
summarise(n = n()) %>%
filter(a < 4)
给出:
# A tibble: 3 × 2
a n
<int> <int>
1 1 11
2 2 8
3 3 16
现在,我如何将其放入函数中?
这里 grp
是分组变量。
fun <- function(d, grp, no){
d %>%
group_by_(grp) %>%
summarise_(n = interp(~ n() )) %>%
filter_( grp < no)
# This final line instead also does not work:
# filter_(interp( grp < no), grp = as.name(grp))
}
现在,
fun(data, 'a', 4)
给出:
# A tibble: 0 × 2
# ... with 2 variables: a <int>, n <int>
我们可以使用 dplyr
开发版本(即将发布 0.6.0)
fun <- function(d, grp, no){
grp <- enquo(grp)
d %>%
group_by(UQ(grp)) %>%
summarise(n = n() )%>%
filter(UQ(grp) < no)
}
fun(data, a, 4)
# A tibble: 3 x 2
# a n
# <int> <int>
#1 1 11
#2 2 8
#3 3 16
我们使用enquo
获取输入参数并将其转换为quosure
,在group_by/summarise/mutate
中,通过取消引号(UQ
或!!
)
上面的函数也可以修改为同时接受带引号和不带引号的参数
fun <- function(d, grp, no){
lst <- as.list(match.call())
grp <- if(is.character(lst$grp)) {
rlang::parse_quosure(grp)
} else enquo(grp)
d %>%
group_by(UQ(grp)) %>%
summarise(n = n() )%>%
filter(UQ(grp) < no)
}
fun(data, a, 4)
# A tibble: 3 x 2
# a n
# <int> <int>
#1 1 11
#2 2 8
#3 3 16
fun(data, 'a', 4)
# A tibble: 3 x 2
# a n
# <int> <int>
#1 1 11
#2 2 8
#3 3 16