将数据框列的名称用作过滤数据框中该列的函数的参数值

时间:2019-09-30 22:09:35

标签: r function filter dplyr names

我想编写一个在函数内使用dplyr::filter()的函数。编写函数时,我在函数中使用参数名称时遇到了问题,该参数名称也是我正在过滤的数据帧的列之一的名称。

假设我将要过滤的数据帧称为dat

library(dplyr)
dat <- data.frame(
a = c(1:10),
b = c(2,2,2,2,2,3,1,1,4,4)
)

并将函数命名为test.filter()

test.filter <- function(b, test.data = dat){
dat.t <- filter(test.data,
              b == b)
return(dat.t)
}

在这里,我要将 b传递给该函数,并要求其根据值{{1来过滤 b }}。我相信功能

b

应产生与

相同的结果
test.filter(b = 4,
        test.data = dat)

但是事实并非如此。我想知道是否在函数范围方面没有考虑什么。任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:2)

在这种情况下,函数的参数“ b”与列名相同。一种选择是在函数参数内进行!!

test.filter <- function(b, test.data = dat){
   filter(test.data,
           b == !!b)

   }

test.filter(b = 4,
     test.data = dat)

答案 1 :(得分:1)

如果传递给函数的参数类似于数据框中的列名之一,则可以使用{{ }}中的curl-curly(rlang)运算符来评估列名

library(rlang)

test.filter <- function(b, test.data = dat) {
      dplyr::filter(dat,{{b}} == b)
}

test.filter(b = 4,test.data = dat)
#   a b
#1  9 4
#2 10 4


test.filter(b = 2,test.data = dat)
#  a b
#1 1 2
#2 2 2
#3 3 2
#4 4 2
#5 5 2

答案 2 :(得分:1)

感谢有用的答案。一位朋友让我知道,造成此问题的根本原因是dplyr使用了懒惰的eval,因此b==b评估为true。