如何将具有多个结果的函数与组一起使用

how to use a function with multiple results with groups

我有一个小问题需要一些帮助。我定义了一个基于 2 个向量计算多个向量的函数。一般的想法是结果是链接的(这就是为什么我只有一个函数),并且计算意味着聚合(结果的元素不仅取决于参数的相同元素,还取决于其他元素)。

我的问题实际上很简单:我想在数据帧上调用我的函数,以便按组计算结果,并将其存储到几个变量中。

基本上,这就是我想要做的:

myFunction <- function(x, y){
  list(a = x + y,
       b = cumsum(x))
}

data <- data.frame(var1 = c(1,2,4,7,2),
           var2 = c(2,6,2,4,6),
           groups = c("a", "a", "b", "b", "b"))

data %>% group_by(groups) %>% mutate(new1 = myFunction(var1, var2)[[1]],
                                     new2 = myFunction(var1, var2)[[2]])

但是,与示例不同,我只想调用我的函数一次。

有人有想法吗?非常感谢!

弗朗索瓦

像这样?我们可以稍微改变一下函数,直接调用它作为自己的步骤。

data <- data.frame(var1 = c(1,2,4,7,2),
                   var2 = c(2,6,2,4,6),
                   groups = c("a", "a", "b", "b", "b"))

myFunction <- function(dt, x, y){
  dt %>%
    mutate(new1 = {{ x }} + {{ y }},
           new2 = cumsum({{ x }}))
}

data %>%
  group_by(groups) %>%
  myFunction(var1, var2)

# A tibble: 5 x 5
# Groups:   groups [2]
   var1  var2 groups  new1  new2
  <dbl> <dbl> <chr>  <dbl> <dbl>
1     1     2 a          3     1
2     2     6 a          8     3
3     4     2 b          6     4
4     7     4 b         11    11
5     2     6 b          8    13

说明 > rlang 的 {{ }} 是一种在单个插值步骤中引用和取消引用的方法。它的目的是延迟评估,即处理管道的非标准评估,函数的变量到需要的时候。

如果将 myFunction 的输出转换为数据框,它会自动在 mutate:

中工作
data %>% 
   group_by(groups) %>% 
   mutate(as.data.frame(myFunction(var1, var2)))

#> # A tibble: 5 x 5
#> # Groups:   groups [2]
#>    var1  var2 groups     a     b
#>   <dbl> <dbl> <chr>  <dbl> <dbl>
#> 1     1     2 a          3     1
#> 2     2     6 a          8     3
#> 3     4     2 b          6     4
#> 4     7     4 b         11    11
#> 5     2     6 b          8    13

显然,您可以在函数内部执行此操作以使 mutate 调用看起来更好,或者像我的示例一样在 mutate 调用内部执行此操作,具体取决于您的函数的重要性returns 列表而不是数据框。