在tidyverse中使用引号对过滤器进行编程

奥斯卡

我有一对变量的
小标题-a_x,a_y,
-b_x,b_y,
-c_x,c_y等。

如何编写根据“ a”,“ b”或“ c”过滤的函数。例如我想回来

filter(df, a_x != a_y) 

要么

filter(df, b_x != b_y)

我正在使用https://dplyr.tidyverse.org/articles/programming.html中所述的quasures ,但没有成功。

这是示例:

test <-tribble(~a_x, ~b_x, ~a_y, ~b_y,
1,2,1,2,
5,6,5,8,
9,8,11,8)

# that works
x <-quo(a_x)
y <-quo(a_y)
filter(test, !!x == !!y)
x <-quo(b_x)
y <-quo(b_y)
filter(test, !!x == !!y)

# but the function doesn't work
my <- function(df, var){
a <- paste0(quo_name(var), "_x")
b <- paste0(quo_name(var), "_y")
print(quo(filter(df, !!a == !!b)))
return(filter(df, !!a == !!b))
}
my(test, "a")
my(test, "b")
阿克伦

当我们传递字符串时,转换为符号并进行求值更容易

library(dplyr)
library(rlang)
my <- function(df, var){
 a <- sym(paste0(var, "_x"))
 b <- sym(paste0(var, "_y"))
 df %>% 
     filter(!!a == !!b)

} 


my(test, "a")
# A tibble: 2 x 4
#    a_x   b_x   a_y   b_y
#  <dbl> <dbl> <dbl> <dbl>
#1     1     2     1     2
#2     5     6     5     8
my(test, "b")
# A tibble: 2 x 4
#    a_x   b_x   a_y   b_y
#  <dbl> <dbl> <dbl> <dbl>
#1     1     2     1     2
#2     9     8    11     8

如果OP也打算传递未加引号的参数,

my <- function(df, var){
   a <- sym(paste0(quo_name(enquo(var)), "_x"))
   b <- sym(paste0(quo_name(enquo(var)), "_y"))

   df %>% 
      filter(!!a == !!b)
}

my(test, a)
my(test, b)

注意:上面接受带引号和不带引号的参数

identical(my(test, "a"), my(test, a))
#[1] TRUE
identical(my(test, "b"), my(test, b))
#[1] TRUE

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Python中使用熊猫对过滤的数据应用过滤器

grep 对过滤器文件名进行排序

如何使用cache2k对过滤器进行单元测试

如何使用angularjs对过滤器进行ng-repeat?

使用 Jasmine 对过滤器组件进行单元测试

对过滤器对象的字典理解

在 DAX 中使用过滤器进行多重联接

在Matlab中使用粒子过滤器进行降噪

在 Flutter 中使用 FutureBuilder 进行 ListView 过滤器搜索

在tidyverse过滤器表达式中使用函数作用域变量

如何在AngularJS 1.x中对过滤器进行单元测试

在mysql group_concat字段中对过滤器进行排序

如何按集合的嵌套属性对过滤器选项进行分组。单选框

Rails URL帮助程序,用于对过滤器进行排序

为什么在 CNN 深度学习中基于相同的图像对过滤器进行不同的训练?

在过滤器中使用引号扫描会引发错误

在页脚中使用过滤器进行列搜索-不显示页脚过滤器-Laravel Datatables Yajrabox

如何在 Scheme 编程中使用带有 lambda 的内置函数过滤器?

无法在AG网格中使用自定义浮动过滤器进行过滤

在Python中使用Lambda +过滤器进行列表过滤

如何在 APIView 而不是 ListAPIView 中使用 django 过滤器进行过滤和搜索?

在DRF中使用Django过滤器

在查询中使用多个过滤器

在过滤器中使用IMPORTRANGE

在Django过滤器中使用dateadd

在Laravel中使用多个过滤器

在高级过滤器中使用间接

使用OR过滤器进行汇总

使用复杂的过滤器进行测量