为什么';t dplyr filter()在函数中工作(即使用变量作为列名)?
使用dplyr函数对数据进行过滤、分组和变异的函数。基本管道序列在函数之外工作得很好,我使用的是真正的列名。将它放在一个函数中,其中列名是一个变量,有些函数可以工作,但有些函数不能工作,尤其是dplyr::filter()。例如:为什么';t dplyr filter()在函数中工作(即使用变量作为列名)?,r,filter,dplyr,R,Filter,Dplyr,使用dplyr函数对数据进行过滤、分组和变异的函数。基本管道序列在函数之外工作得很好,我使用的是真正的列名。将它放在一个函数中,其中列名是一个变量,有些函数可以工作,但有些函数不能工作,尤其是dplyr::filter()。例如: var1 <- c('yes', NA, NA, 'yes', 'yes', NA, NA, NA, 'yes', NA, 'no', 'no', 'no', 'maybe', NA, 'maybe', 'maybe', 'maybe') var2 <-
var1 <- c('yes', NA, NA, 'yes', 'yes', NA, NA, NA, 'yes', NA, 'no', 'no', 'no', 'maybe', NA, 'maybe', 'maybe', 'maybe')
var2 <- c(1:18)
df <- data.frame(var1, var2)
…但这并不是:
x <- "var1"
df%>%filter(!is.na(x))
需要特别过滤掉的是NA
尝试获取(“x”),不好,切片:
df[!is.na(x),]
……也不行
关于如何将变量传递到函数内部(或外部)进行过滤,以及为什么变量与其他dplyr函数一起工作,有什么想法吗?我们可以使用
sym
转换为符号,然后使用UQ
对其进行评估
library(rlang)
library(dplyr)
df %>%
filter(!is.na(UQ(sym(x))))
# var1 var2
#1 yes 1
#2 yes 4
#3 yes 5
#4 yes 9
#5 no 11
#6 no 12
#7 no 13
#8 maybe 14
#9 maybe 16
#10 maybe 17
#11 maybe 18
这也会起作用,而且更简单一点-只需引用包含方括号之间的列名的变量,并使用(.)引用输入df:
> df %>% filter(!is.na((.)[x]))
var1 var2
1 yes 1
2 yes 4
3 yes 5
4 yes 9
5 no 11
6 no 12
7 no 13
8 maybe 14
9 maybe 16
10 maybe 17
11 maybe 18
请注意,这也适用于以下功能:
myfun <- function(df, var) {
df %>% filter(!is.na((.)[var]))
}
x <- "var1"
myfun(df, x)
var1 var2
1 yes 1
2 yes 4
3 yes 5
4 yes 9
5 no 11
6 no 12
7 no 13
8 maybe 14
9 maybe 16
10 maybe 17
11 maybe 18
myfun%过滤器(!is.na((.[var]))
}
由于我的声誉不高,无法在上面发表评论。。。我建议在这里看看我的答案:
如果要使用dplyr创建函数,需要按照以下网页中的说明进行操作:
库(tidyverse)
var1有一个新的包,它将标准评估标准传递给dplyr。试试看。您可以将普通的带引号的代码传递给dplyr。它使在dplyr中传递参数和编写函数变得更容易
对于您的情况:
install.packages("seplyr")
library(seplyr)
x<-"var1"
df%>%filter_se(paste0("!is.na(", x , ")"))
install.packages(“seplyr”)
图书馆(九月)
x%过滤器(粘贴0(“!is.na(“,x,”)”)
为什么只使用筛选函数,而不使用select()?@ConnerMselect
同时接受未加引号和带引号的字符串,即df%>%select('var1')
和df%>%select(var1)
这不仅适用于filter
。如果您想要一些摘要,那么您必须执行相同的步骤sym是否属于特定的包?@ConnerM。它在rlang
中,但我认为如果您安装tidyverse
并加载软件包,应该加载它。假设您想总结df%>%summary(count=sum(!is.na(UQ(sym(x ')))
关于gather()有什么想法吗?
myfun <- function(df, var) {
df %>% filter(!is.na((.)[var]))
}
x <- "var1"
myfun(df, x)
var1 var2
1 yes 1
2 yes 4
3 yes 5
4 yes 9
5 no 11
6 no 12
7 no 13
8 maybe 14
9 maybe 16
10 maybe 17
11 maybe 18
library(tidyverse)
var1 <- c('yes', NA, NA, 'yes',
'yes', NA, NA, NA, 'yes', NA, 'no',
'no', 'no', 'maybe', NA, 'maybe',
'maybe', 'maybe')
var2 <- c(1:18)
df <- data_frame(var1, var2)
your_function <- function(df, filter) {
# Make filter a quosure
filter = enquo(filter)
df %>%
filter(!is.na(!!filter)) -> new_df
return(new_df)
}
new_df <- your_function(df = df, filter = var1)
install.packages("seplyr")
library(seplyr)
x<-"var1"
df%>%filter_se(paste0("!is.na(", x , ")"))