为什么';t 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 <-

使用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)
…但这并不是:

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()?@ConnerM
select
同时接受未加引号和带引号的字符串,即
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 , ")"))