在dplyr mutate()中返回一个列表

时间:2014-02-07 14:36:51

标签: r data.table dplyr

我的真实世界问题中有一个返回列表的函数。有没有办法在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 变量的第一个“列”中循环显示函数的输出,但是不明白为什么。

谢谢!

3 个答案:

答案 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