数据表中的逐个元素乘法 - 同时有多个变量(R)

nhe*_*121 3 r data.table

假设我有以下数据表R:

L3 <- LETTERS[1:3]
(d <- data.table(cbind(x = 1, y = 1:10), fac = sample(L3, 10, replace = TRUE)))
vecfx=c(5.3,2.8)
Run Code Online (Sandbox Code Playgroud)

我想计算两个新的变量,dot1dot2具有以下特点:

d[,dot1:=5.3*x]
d[,dot2:=2.8*y] 
Run Code Online (Sandbox Code Playgroud)

但我不想以这种方式计算它们,因为这是我的问题的放松.在我原来的问题中,vecfx由12个元素组成,我的数据表有twuelve列,所以我想避免写两次.

我试过这个:vecfx*d[,list(x,y)]但是我没有得到理想的结果(似乎产品是由行而不是列完成的).另外,我想在我的数据表中创建这两个新变量d.

当想要在数据表中同时创建多个列时,这也很有用R.

任何帮助表示赞赏.

Aru*_*run 8

更新:在v1.8.11中,FR#2077现已实现 - set()现在可以通过引用添加列.来自新闻:

set()现在可以通过引用添加新列.例如,set(DT, i=3:5, j="bla", 5L)相当于DT[3:5, bla := 5L].这是FR #2077.测试补充说.

那时人们可以做什么(正如@MatthewDowle建议的评论):

for (j in seq_along(vecfx)) 
    set(d, i=NULL, j=paste0("dot", j), vecfx[j]*d[[j]])
Run Code Online (Sandbox Code Playgroud)

我想你在找?set.请注意,set()也通过引用添加,非常快!粘贴相关部分?set:

由于[.data.table产生开销以检查参数的存在和类型(例如),set()通过引用提供直接(但不太灵活)的分配,具有低开销,适合在for循环内使用.见例子.:=是更灵活的比set(),因为:=意在与结合i在单一的查询对大数据集和通过.

for (j in seq_along(vecfx)) 
    set(d, i=NULL, j=j, vecfx[j]*d[[j]])
      x    y fac
 1: 5.3  2.8   B
 2: 5.3  5.6   C
 3: 5.3  8.4   C
 4: 5.3 11.2   C
 5: 5.3 14.0   B
 6: 5.3 16.8   B
 7: 5.3 19.6   C
 8: 5.3 22.4   C
 9: 5.3 25.2   C
10: 5.3 28.0   C
Run Code Online (Sandbox Code Playgroud)

这只是提供正确的指数的问题set.


Mat*_*wle 8

阿伦的答案很好.

:=接受多个项目的LHS和RHS 另一种方式是:

d[,paste0("dot",1:2):=mapply("*",vecfx,list(x,y),SIMPLIFY=FALSE)]
d
    x  y fac dot1 dot2
 1: 1  1   C  5.3  2.8
 2: 1  2   B  5.3  5.6
 3: 1  3   C  5.3  8.4
 4: 1  4   C  5.3 11.2
 5: 1  5   B  5.3 14.0
 6: 1  6   A  5.3 16.8
 7: 1  7   A  5.3 19.6
 8: 1  8   B  5.3 22.4
 9: 1  9   A  5.3 25.2
10: 1 10   A  5.3 28.0
Run Code Online (Sandbox Code Playgroud)

也许有比这更好的方法.我认为Arun for应该更快,也许更容易阅读.