【发布时间】:2014-02-09 18:21:16
【问题描述】:
在上一个问题Return a list in dplyr mutate() 中明确指出,虽然 dlpyr 在 0.2 版中不能从函数返回的向量创建新变量,但 data.table() 可以使用语法 -:
it[, c(paste0("V", 4:5)) := myfun(V2, V3)]
如果该问题中的函数myfun 更改为 -:
myfun = function(arg1,arg2) {
if (arg1 > arg2) {
temp1 = arg1 + arg2
temp2 = arg1 - arg2 }
else {
temp1 = arg1 * arg2
temp2 = arg1 / arg2 }
list(temp1,temp2)
}
上面发布的解决方案返回警告-:
it = data.table(c("a","a","b","b","c"),c(1,2,3,4,5), c(2,3,4,2,2))
it[, c(paste0("V", 4:5)) := myfun(V2, V3)]
Warning message:
In if (arg1 > arg2) { :
the condition has length > 1 and only the first element will be used
这意味着 data.table() 以某种方式将不止一行传递给函数。为什么会出现这种情况?
【问题讨论】:
-
该警告来自您的函数。只是做
myfun(it$V2, it$V3)会给出同样的警告。这是因为您在执行arg1 > arg2时正在比较两个向量(长度> 1)。因此,它只需要第一个值(并提供警告)。
标签: r data.table