如何在R中过滤函数中的变量?

如何在R中过滤函数中的变量?,r,function,filtering,R,Function,Filtering,在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"

在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


mpg
#定义一个名为select_fun的简单函数
选择_fun 2)
报税表(a)
}
选择_fun(“disp”)
输出:
车型显示年份气缸变速器drv cty hwy等级
奥迪a4 1.8 1999 4自动(l5)f 18 29 p紧凑型
奥迪a4 1.8 1999 4手动(m5)f 21 29 p紧凑型
奥迪a4 2.0 2008 4手动(m6)f 20 31 p紧凑型
奥迪a4 2.0 2008 4自动(av)f 21 30 p紧凑型
奥迪a4 2.8 1999 6自动(l5)f 16 26 p紧凑型
奥迪a4 2.8 1999 6手动(m5)f 18 26 p紧凑型
奥迪a4 3.1 2008 6自动(av)f 18 27 p紧凑型
输出不正确,因为过滤后的值仍然存在。 也许我错过了一些非常简单和愚蠢的事情!! 任何帮助都将不胜感激
谢谢

有多种方法可以解决此问题:

library(dplyr)
library(rlang)
1) 在处使用过滤器:

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

还有一个,与Ronak Shah的
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
select\u fun4%过滤器({x}>2)
}
选择_fun4(mpg,显示)
#一个tibble:191x11
制造商型号显示年份气缸变速器drv cty hwy fl等级
1奥迪a4 2.8 1999 6自动(l5)f 16 26 p紧凑型
2奥迪a4 2.8 1999 6手动(m5)f 18 26 p紧凑型
3奥迪a4 3.1 2008 6自动(av)f 18 27 p紧凑型
4奥迪a4 quattro 2.8 1999 6自动(l5)4 15 25 p紧凑型
5奥迪a4 quattro 2.8 1999 6手动(m5)4 17 25 p紧凑型
6奥迪a4 quattro 3.1 2008 6自动(s6)4 17 25 p紧凑型
7奥迪a4 quattro 3.1 2008 6手动(m6)4 15 25 p紧凑型
8奥迪a6 quattro 2.8 1999 6自动(l5)4 15 24 p中型车
9奥迪a6 quattro 3.1 2008 6自动(s6)4 17 25 p中型车
10奥迪a6 quattro 4.2 2008 8自动(s6)4 16 23 p中型车
# ... 还有181行

可能意外单击了它。你的回答很准确!!谢谢,现在我可以用一个类似的函数过滤掉所有变量的z分数范围。谢谢,非常感谢
select_fun3 <- function(df, x) {
   a <- df %>% filter(!!sym(x) > 2)
   return(a)
}
identical(select_fun1(mpg, 'displ'), select_fun2(mpg, 'displ'))
#[1] TRUE
identical(select_fun1(mpg, 'displ'), select_fun3(mpg, 'displ'))
#[1] TRUE
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