将向量作为单独的新列附加到 data.table,向量回收单个值

Posted

技术标签:

【中文标题】将向量作为单独的新列附加到 data.table,向量回收单个值【英文标题】:Appending a vector to a data.table as separate new columns, vector-recycling single values 【发布时间】:2017-04-19 16:03:31 【问题描述】:

我想向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.

【问题讨论】:

它适用于vlist &lt;- list(c=5, d=6) 不要说“使用单个值”,您想要的术语是“矢量回收单个值” 【参考方案1】:

我们也可以不用循环就可以做到这一点

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

【讨论】:

啊,as.list 而不是 list,谢谢。为什么names(v) 周围不需要括号?它也适用于他们。 @MaxGhenis 使用括号可能会更好,因为它更通用,即 `cols @Max 真的,v 应该从一开始就使用v = list(c = ...) 指定。表行是(有序的)元组而不是向量。【参考方案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

【讨论】:

更好的for 循环可能是for (name in names(v)) set(x, j = name, value = v[name])

以上是关于将向量作为单独的新列附加到 data.table,向量回收单个值的主要内容,如果未能解决你的问题,请参考以下文章

熊猫:追加行小计的新列

是否有更快的方法来获取基于线性回归模型的值并将其附加到 DataFrame 中的新列?

如何按 > 日期对一系列日期求和并将它们附加到熊猫新数据框中的新列?

需要使用 xsl 将新添加的条目添加到给定 xml 的新列

R data.table:如何使用字符串中的名称创建新列?

在一个命令中添加具有外键约束的新列