2017-04-19 148 views
1

我想將矢量添加到data.table,矢量元素的每個名稱都對應一個新列,並且基於vector的重複值元素值。將vector添加爲data.table作爲單獨值的單獨新列

所以給出:

x <- data.table(a=1:2, b=3:4) 
v <- c(c=5, d=6) 

我正在尋找的結果:

data.table(a=1:2, b=3:4, c=5, d=6) 
# a b c d 
# 1: 1 3 5 6 
# 2: 2 4 5 6 

事情我想:

cbind增加了向量作爲一列:

cbind(x, v) 
# a b v 
# 1: 1 3 5 
# 2: 2 4 6 

adding multiple columns to a data.table, where column names are held in a vector使用方法也向量化的方式,我不想:

x[, (names(v)) := v] 
# a b c d 
# 1: 1 3 5 5 
# 2: 2 4 6 6 

x[, (names(v)) := list(v)] 
# Same as above. 

回答

2

我們可以做到這一點不也循環

x[, names(v) := as.list(v)] 
x 
# a b c d 
#1: 1 3 5 6 
#2: 2 4 5 6 
+0

啊,'as.list'而不是'list',謝謝。爲什麼在名字(v)'旁邊不需要parens?它也適用於它們。 –

+1

@MaxGhenis使用parens可能會更好,因爲它更通用,即'cols < - names(v); x [,(cols):= as.list(v)] 1 – akrun

+1

@Max真的,'v'應該從一開始就用'v = list(c = ...)'指定。錶行是(有序的)元組而不是向量。 – Frank

2

循環作品:

for (i in seq_along(v)) x[, (names(v)[i]) := v[i]] 

結果:

x 
# a b c d 
# 1: 1 3 5 6 
# 2: 2 4 5 6 
+2

更好的'for'循環可能是'for(name in name(v))set(x,j = name,value = v [name])''。 – A5C1D2H2I1M1N2O1R2T1