我有一个返回列表中两个值的函数。这两个值都需要添加到 data.table 的两个新列中。函数的评估成本很高,因此我想避免计算函数两次。这是例子:
library(data.table)
example(data.table)
DT
x y v
1: a 1 42
2: a 3 42
3: a 6 42
4: b 1 4
5: b 3 5
6: b 6 6
7: c 1 7
8: c 3 8
9: c 6 9
这是我的函数的一个例子。请记住,我说过这是一种昂贵的计算,除此之外,无法从其他给定值中推导出一个返回值(如下例所示):
myfun <- function (y, v)
{
ret1 = y + v
ret2 = y - v
return(list(r1 = ret1, r2 = ret2))
}
这是我在一个语句中添加两列的方法。然而,那个需要调用 myfun 两次:
DT[,new1:=myfun(y,v)$r1][,new2:=myfun(y,v)$r2]
x y v new1 new2
1: a 1 42 43 -41
2: a 3 42 45 -39
3: a 6 42 48 -36
4: b 1 4 5 -3
5: b 3 5 8 -2
6: b 6 6 12 0
7: c 1 7 8 -6
8: c 3 8 11 -5
9: c 6 9 15 -3
关于如何执行此操作有什么建议吗?我可以拯救r2
每次我调用 myfun 时,在一个单独的环境中,我只需要一种通过引用一次添加两列的方法。
Since data.table
v1.8.3,你可以这样做:
DT[, c("new1","new2") := myfun(y,v)]
另一种选择是存储函数的输出并逐一添加列:
z <- myfun(DT$y,DT$v)
head(DT[,new1:=z$r1][,new2:=z$r2])
# x y v new1 new2
# [1,] a 1 42 43 -41
# [2,] a 3 42 45 -39
# [3,] a 6 42 48 -36
# [4,] b 1 4 5 -3
# [5,] b 3 5 8 -2
# [6,] b 6 6 12 0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)