我有一个返回列表的函数。我正在使用 mutate
在与输出相对应的数据框中添加列。计算相当复杂,所以我宁愿只调用一次函数。我对R和dplry相当陌生,无法找到一种更有效的方法。
这是我现在正在做的一个非常简单的例子。
library(dplyr)
testFun <- function(x,z)
{
list(x2=x*x + z, x3=x*x*x + z)
}
have <- data.frame(x=seq(1:10),y=1,z=0)
want <- have %>%
dplyr::mutate(x2=testFun(x,z)$x2,
x3=testFun(x,z)$x3)
我怎样才能更有效地做到这一点?
最佳答案
我们可以使用 pmap
library(purrr)
library(dplyr)
pmap_dfr(have %>%
select(x, z), testFun) %>%
bind_cols(have, .)
# x y z x2 x3
#1 1 1 0 1 1
#2 2 1 0 4 8
#3 3 1 0 9 27
#4 4 1 0 16 64
#5 5 1 0 25 125
#6 6 1 0 36 216
#7 7 1 0 49 343
#8 8 1 0 64 512
#9 9 1 0 81 729
#10 10 1 0 100 1000
或者,如果我们可以通过引用(
quote
或 quo
)来更改函数,这将变得更容易testFun <- function(x,z){
list(x2= quo(x*x + z), x3= quo(x*x*x + z))
}
have %>%
mutate(!!! testFun(x, z))
# x y z x2 x3
#1 1 1 0 1 1
#2 2 1 0 4 8
#3 3 1 0 9 27
#4 4 1 0 16 64
#5 5 1 0 25 125
#6 6 1 0 36 216
#7 7 1 0 49 343
#8 8 1 0 64 512
#9 9 1 0 81 729
#10 10 1 0 100 1000
关于R dplyr::mutate - 添加返回列表中的所有元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49985093/