如何将具有多个结果的函数与组一起使用
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 列表而不是数据框。
我有一个小问题需要一些帮助。我定义了一个基于 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 列表而不是数据框。