假设我有以下数据表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)
我想计算两个新的变量,dot1
并dot2
具有以下特点:
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
.
任何帮助表示赞赏.
更新:在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
.
阿伦的答案很好.
:=
接受多个项目的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
应该更快,也许更容易阅读.