gpt4 book ai didi

r - 使用引用在 tidyverse 中编程过滤器

转载 作者:行者123 更新时间:2023-12-01 13:18:57 25 4
gpt4 key购买 nike

我对成对变量有一个小问题:
- 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)

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

这是例子:

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

关于r - 使用引用在 tidyverse 中编程过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51679872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com