gpt4 book ai didi

r - curl 整洁的评估编程,具有多个输入和跨列的自定义函数

转载 作者:行者123 更新时间:2023-12-03 20:04:51 25 4
gpt4 key购买 nike

我的问题类似于 this question但我需要跨列应用更复杂的函数,我无法弄清楚如何将 Lionel 的建议解决方案应用于具有范围动词(如 filter_at())的自定义函数。或 filter() + across()相等的。它看起来不像一个“ super ”/{{{}}}运算符已被引入。
这是我想做的一个非编程示例(不使用 NSE):

library(dplyr)
library(magrittr)

foo <- tibble(group = c(1,1,2,2,3,3),
a = c(1,1,0,1,2,2),
b = c(1,1,2,2,0,1))

foo %>%
group_by(group) %>%
filter_at(vars(a,b), any_vars(n_distinct(.) != 1)) %>%
ungroup
#> # A tibble: 4 x 3
#> group a b
#> <dbl> <dbl> <dbl>
#> 1 2 0 2
#> 2 2 1 2
#> 3 3 2 0
#> 4 3 2 1
我还没有找到与此等效的 filter_at线与 filter + across()然而,由于新的(ish)tidyeval 函数早于 dplyr 1.0,我认为这个问题可以搁置一旁。这是我尝试制作一个程序版本,其中过滤变量是用户提供的点:
my_function <- function(data, ..., by) {
dots <- enquos(..., .named = TRUE)

helperfunc <- function(arg) {
return(any_vars(n_distinct(arg) != length(arg)))
}

dots <- lapply(dots, function(dot) call("helperfunc", dot))

data %>%
group_by({{ by }}) %>%
filter(!!!dots) %>%
ungroup
}

foo %>%
my_function(a, b, group)
#> Error: Problem with `filter()` input `..1`.
#> x Input `..1` is named.
#> i This usually means that you've used `=` instead of `==`.
#> i Did you mean `a == helperfunc(a)`?
如果有一种方法可以在 vars() 中插入 NSE 运算符,我会很高兴。参数在 filter_at并且不必进行所有这些额外的调用(我认为这是 {{{}}} 函数会做什么?)

最佳答案

这是使用 across() 的方法要实现这一点,vignette("colwise") 中涵盖了这一点。 .

my_function <- function(data, vars, by) {

data %>%
group_by({{ by }}) %>%
filter(n_distinct(across({{ vars }}, ~ .x)) != 1) %>%
ungroup()

}

foo %>%
my_function(c(a, b), by = group)

# A tibble: 4 x 3
group a b
<dbl> <dbl> <dbl>
1 2 0 2
2 2 1 2
3 3 2 0
4 3 2 1

关于r - curl 整洁的评估编程,具有多个输入和跨列的自定义函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63257632/

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