我的真实世界问题中有一个返回列表的函数。有没有办法在dplyr mutate()中使用它?这个玩具示例不起作用 - :
it = data.table(c("a","a","b","b","c"),c(1,2,3,4,5), c(2,3,4,2,2))
myfun = function(arg1,arg2) {
temp1 = arg1 + arg2
temp2 = arg1 - arg2
list(temp1,temp2)
}
myfun(1,2)
it%.%mutate(new = myfun(V2,V3))
我看到它在 new 变量的第一个“列”中循环显示函数的输出,但是不明白为什么。
谢谢!
答案 0 :(得分:10)
使用data.table
执行此操作的惯用方法是使用:=
(按引用分配)运算符。这是一个例子:
it[, c(paste0("V", 4:5)) := myfun(V2, V3)]
如果你真的想要一个清单,为什么不呢:
as.list(it[, myfun(V2, V3)])
或者,也许这就是你想要的,但为什么你不只是使用data.table
功能:
it[, c(.SD, myfun(V2, V3))]
# V1 V2 V3 V4 V5
# 1: a 1 2 3 -1
# 2: a 2 3 5 -1
# 3: b 3 4 7 -1
# 4: b 4 2 6 2
# 5: c 5 2 7 3
请注意,如果要myfun
命名它的输出,那么名称将显示在最终结果列中:
# V1 V2 V3 new.1 new.2
# 1: a 1 2 3 -1
# 2: a 2 3 5 -1
# 3: b 3 4 7 -1
# 4: b 4 2 6 2
# 5: c 5 2 7 3
答案 1 :(得分:0)
mutate()函数旨在将新列添加到现有数据框中。数据帧是相同长度的矢量列表。因此,您无法将列表添加为新列,因为列表不是矢量。
您可以将函数重写为两个函数,每个函数都返回一个向量。然后使用mutate()分别应用这些中的每一个,它应该可以工作。
答案 2 :(得分:0)
鉴于此问题的标题,我想我应该发布一个使用tidyverse
的{{1}}解决方案。请注意,dplyr::mutate
需要输出myfun
才能起作用。
data.frame