7

我想将矩阵分配给 a 的多列子集,data.table但矩阵最终被视为列向量。例如,

dt1 <- data.table(a1=rnorm(5), a2=rnorm(5), a3=rnorm(5))
m1 <- matrix(rnorm(10), ncol=2)
dt1[,c("a1","a2")] <- m1

Warning messages:
1: In `[<-.data.table`(`*tmp*`, , c("a1", "a2"), value = c(-0.308851784175091,  :
  2 column matrix RHS of := will be treated as one vector
2: In `[<-.data.table`(`*tmp*`, , c("a1", "a2"), value = c(-0.308851784175091,  :
  Supplied 10 items to be assigned to 5 items of column 'a1' (5 unused)
3: In `[<-.data.table`(`*tmp*`, , c("a1", "a2"), value = c(-0.308851784175091,  :
  2 column matrix RHS of := will be treated as one vector
4: In `[<-.data.table`(`*tmp*`, , c("a1", "a2"), value = c(-0.308851784175091,  :
  Supplied 10 items to be assigned to 5 items of column 'a2' (5 unused)

这个问题可以通过首先转换m1为另一个data.table对象来解决,但我很好奇这个错误的原因是什么。dt1如果是data.frame;则上述语法将起作用 不使用它的架构原理是什么data.table

4

2 回答 2

6
dt1[,c("a1","a2")] <- as.data.table(m1)

给出了一个简单的解决方案,但确实复制了。

@Simon O'Hanlon 提供了一个解决方案data.table

dt1[ , `:=`( a1 = m1[,1] , a2 = m1[,2] ) ]

在我看来,@Frank 提供了一个更好的data.table解决方案:

dt1[,c("a1","a2") := as.data.table(m1)]
于 2019-06-26T14:03:47.280 回答
3

Adata.frame不是 a matrix,也不是data.tablea matrixdata.framedata.table对象都是lists。这些存储方式非常不同,尽管索引可能相似,但这是在后台处理的。

Within[<-.data.frame将一个矩阵值拆分value为一个列表,其中每列都有一个元素。

(线是value <- split(value, col(value))))。

另请注意,这[<-.data.frame将在将某些内容分配给列子集的过程中复制整个 data.frame。

data.table试图避免这种复制,因此[<-.data.table应该避免,因为所有<-方法都R制作副本。

[<-.data.table[<-.data.frame如果是一个矩阵,将被调用i,但不是如果只是value

data.table通常希望您在分配时明确确保数据类型匹配。这有助于避免任何强制和相关的复制。

您可以在此处提出功能请求以确保兼容性,但鉴于您的使用远远超出推荐的范围,那么也许包作者可能会要求您简单地使用data.table约定和方法。

于 2013-11-12T02:08:09.973 回答