R Data.table使用用户定义的函数分配新列

时间:2015-08-05 15:53:56

标签: r data.table

我对以下示例感到担忧。

library(data.table)

set.seed(1)
table1 <- data.table(a=sample(10,5,TRUE),b=sample(10,5,TRUE))
function1 <- function(a,b){
  a*b+runif(1)
}
table1[,c:=function1(a,b)]
table1[,d:=unlist(mapply(function1,a,b))]
set(table1,NULL,"e",unlist(mapply(function1,table1[,a],table1[,b])))
table1
    a  b         c         d         e
1:  3  9 27.205975 27.176557 27.717619
2:  4 10 40.205975 40.687023 40.991906
3:  6  7 42.205975 42.384104 42.380035
4: 10  7 70.205975 70.769841 70.777445
5:  3  1  3.205975  3.497699  3.934705

我想使用我用来创建'列c'的语法,但是当我使用该语法时,runif(1)生成的数字总是相同的。我发现了两种解决问题的方法('列d'和'列e'),但我显然更喜欢用于'column c'的语法。有人为我提供解决方案吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

列c 语法中,data.table实际上向function1发送了两个向量,但runif(1)只是一个数字,R转换为向量相同的价值。为避免这种情况,将向量的长度传递给runif函数(或建议的runif(length(a))

function1 <- function(a,b, N){
  a*b+runif(N)
}
table1[,c:=function1(a,b, .N)]

其他选择是逐行评估功能(我想你已经考虑过了)

table1[, id:=.I][, function1(a,b), by = id]

但效率不高