Использование имени столбца фрейма данных в качестве значения параметра для функции, которая фильтрует этот столбец в фрейме данных - PullRequest
3 голосов
/ 01 октября 2019

Я хотел бы написать функцию, которая использует 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 для функции и запрос ее фильтрации столбца b на основе значения b. Я считаю, что функция

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

должна давать тот же результат, что и

filter(dat,
   b == 4)

Однако это не так. Мне интересно, есть ли что-то, что я не рассматриваю с точки зрения объема функции. Любая помощь приветствуется!

Ответы [ 3 ]

2 голосов
/ 01 октября 2019

Это тот случай, когда аргумент 'b' функции совпадает с именем столбца. Один из вариантов - сделать !! внутри аргумента функции

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

   }

test.filter(b = 4,
     test.data = dat)
1 голос
/ 01 октября 2019

Спасибо за полезные ответы. Друг, дайте мне знать, что основной причиной проблемы является dplyr использует lazy eval, поэтому b==b оценивает все как истинное.

1 голос
/ 01 октября 2019

Если аргумент, переданный функции, подобен одному из имен столбцов в кадре данных, мы можем использовать оператор curly-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
...