Как отфильтровать переменную внутри функции в R? - PullRequest
1 голос
/ 06 мая 2020

Мне нужна помощь в чем-то очень простом в R. Я определил функцию для выполнения нескольких операций, и я не могу выбрать переменную при вызове функции с использованием входных параметров.

Например: Использование набора данных mpg просто для справки, мне нужно отфильтровать все столбцы, в которых disp> 2.0


mpg 

#Defining a simple function called select_fun

select_fun <- function(x)
  {

  a <- mpg %>% filter(x >  2) 

  return(a)

}

select_fun("disp")

Output: 

<chr> model disp  year  cyl  trans     drv  cty  hwy   class
audi    a4  1.8 1999    4   auto(l5)    f   18  29  p   compact
audi    a4  1.8 1999    4   manual(m5)  f   21  29  p   compact
audi    a4  2.0 2008    4   manual(m6)  f   20  31  p   compact
audi    a4  2.0 2008    4   auto(av)    f   21  30  p   compact
audi    a4  2.8 1999    6   auto(l5)    f   16  26  p   compact
audi    a4  2.8 1999    6   manual(m5)  f   18  26  p   compact
audi    a4  3.1 2008    6   auto(av)    f   18  27  p   compact

Вывод неверен, поскольку отфильтрованные значения все еще присутствуют. Может, я упускаю что-то действительно простое и глупое !! Любая помощь будет очень признательна Спасибо !!

Ответы [ 2 ]

3 голосов
/ 06 мая 2020

Есть несколько способов решить эту проблему:

library(dplyr)
library(rlang)

1) Используйте filter_at:

select_fun1 <- function(df, x) {
   a <- df %>% filter_at(vars(x), any_vars(. > 2))
   return(a)
}

2) Используйте базовое подмножество R

select_fun2 <- function(df, x) {
   a <- df[df[[x]] > 2,]
   return(a)
}

3) Используйте нестандартную оценку

select_fun3 <- function(df, x) {
   a <- df %>% filter(!!sym(x) > 2)
   return(a)
}

Убедитесь, что результаты 3 совпадают.

identical(select_fun1(mpg, 'displ'), select_fun2(mpg, 'displ'))
#[1] TRUE
identical(select_fun1(mpg, 'displ'), select_fun3(mpg, 'displ'))
#[1] TRUE
1 голос
/ 06 мая 2020

Еще один, почти идентичный select_fun3 Ронака Шаха, но немного короче (благодаря оператору curly-curly), и вам не нужно заключать имя переменной в кавычки:

select_fun4 <- function(df, x) {
   df %>% filter({{x}} > 2)
   }

select_fun4(mpg, displ)
# A tibble: 191 x 11
   manufacturer model      displ  year   cyl trans      drv     cty   hwy fl    class  
   <chr>        <chr>      <dbl> <int> <int> <chr>      <chr> <int> <int> <chr> <chr>  
 1 audi         a4           2.8  1999     6 auto(l5)   f        16    26 p     compact
 2 audi         a4           2.8  1999     6 manual(m5) f        18    26 p     compact
 3 audi         a4           3.1  2008     6 auto(av)   f        18    27 p     compact
 4 audi         a4 quattro   2.8  1999     6 auto(l5)   4        15    25 p     compact
 5 audi         a4 quattro   2.8  1999     6 manual(m5) 4        17    25 p     compact
 6 audi         a4 quattro   3.1  2008     6 auto(s6)   4        17    25 p     compact
 7 audi         a4 quattro   3.1  2008     6 manual(m6) 4        15    25 p     compact
 8 audi         a6 quattro   2.8  1999     6 auto(l5)   4        15    24 p     midsize
 9 audi         a6 quattro   3.1  2008     6 auto(s6)   4        17    25 p     midsize
10 audi         a6 quattro   4.2  2008     8 auto(s6)   4        16    23 p     midsize
# ... with 181 more rows
...