为什么 dplyr filter() 不能在函数内工作(即使用变量作为列名)?

Con*_* M. 8 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 <- c(1:18)

df <- data.frame(var1, var2)
Run Code Online (Sandbox Code Playgroud)

这工作正常(即过滤 NA):

df%>%filter(!is.na(var1))
Run Code Online (Sandbox Code Playgroud)

...但这并没有:

x <- "var1"

df%>%filter(!is.na(x))
Run Code Online (Sandbox Code Playgroud)

...但这确实:

df%>%select(x)
Run Code Online (Sandbox Code Playgroud)

需要专门过滤掉 NA。

尝试了 get("x"),不行,然后切片:

df[!is.na(x),]
Run Code Online (Sandbox Code Playgroud)

……也不好。

有关如何传递变量以在函数内部(或外部)进行过滤以及为什么变量与其他 dplyr 函数一起使用的任何想法?

akr*_*run 7

我们可以使用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
Run Code Online (Sandbox Code Playgroud)