2017-04-19 150 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