R,使用 dplyr::filter() 和 %in% 将列名作为参数传递给函数
R, pass column name as argument to function using dplyr::filter() and %in%
如何在与问题 here 类似但使用 dplyr
链接和 filter()
以及 %in%
.[=19= 的函数中传递列名]
require(dplyr)
set.seed(8)
df <- data.frame(
A=sample(c(1:3), 10, replace=T),
B=sample(c(1:3), 10, replace=T))
如果想获取 A 列为 1 或 2 的行,我可以这样做:
df %>% filter(A %in% c(1,2))
我得到:
A B
1 2 3
2 1 2
3 1 3
4 2 1
5 1 1
6 1 3
现在,我怎样才能把它放在一个函数中,在那里可以指定列,这是行不通的:
fun1 <- function(x, column, n){
res <-
x %>% filter(column %in% n)
return(res)
}
fun1(df, A, c(1,2))
你可以试试
fun1 <- function(x, column, n){
x %>%
filter_(lazyeval::interp(quote(x %in% y), x=as.name(column), y=n))
}
fun1(df, 'A', 1:2)
或者
fun2 <- function(x, column, n){
args <- as.list(match.call())
x %>%
filter(eval(args$column, x) %in% n)
}
fun2(df, A, 1:2)
如果你想保留你的功能,试试:
fun1 <- function(x, column, n){
res <- x %>% filter_(paste(column,"%in%",n))
return(res)
}
fun1(df, "A", "c(1,2)")
尝试将函数更改为
fun1 <- function(x, column, n){
require(lazyeval)
filter_(x,
interp(quote(col %in% n),
col = lazy(column), n = n))
}
all(fun1(df, A, c(1, 2)) == filter(df, A %in% c(1,2)))
# TRUE
如何在与问题 here 类似但使用 dplyr
链接和 filter()
以及 %in%
.[=19= 的函数中传递列名]
require(dplyr)
set.seed(8)
df <- data.frame(
A=sample(c(1:3), 10, replace=T),
B=sample(c(1:3), 10, replace=T))
如果想获取 A 列为 1 或 2 的行,我可以这样做:
df %>% filter(A %in% c(1,2))
我得到:
A B
1 2 3
2 1 2
3 1 3
4 2 1
5 1 1
6 1 3
现在,我怎样才能把它放在一个函数中,在那里可以指定列,这是行不通的:
fun1 <- function(x, column, n){
res <-
x %>% filter(column %in% n)
return(res)
}
fun1(df, A, c(1,2))
你可以试试
fun1 <- function(x, column, n){
x %>%
filter_(lazyeval::interp(quote(x %in% y), x=as.name(column), y=n))
}
fun1(df, 'A', 1:2)
或者
fun2 <- function(x, column, n){
args <- as.list(match.call())
x %>%
filter(eval(args$column, x) %in% n)
}
fun2(df, A, 1:2)
如果你想保留你的功能,试试:
fun1 <- function(x, column, n){
res <- x %>% filter_(paste(column,"%in%",n))
return(res)
}
fun1(df, "A", "c(1,2)")
尝试将函数更改为
fun1 <- function(x, column, n){
require(lazyeval)
filter_(x,
interp(quote(col %in% n),
col = lazy(column), n = n))
}
all(fun1(df, A, c(1, 2)) == filter(df, A %in% c(1,2)))
# TRUE