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 でも aでもmatrixありません。とオブジェクトの両方がです。これらは非常に異なる方法で保存されますが、インデックス作成は似ている場合がありますが、内部で処理されます。data.tablematrixdata.framedata.tablelists

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 に答える