最初に、列名を持つ空のデータテーブルを作成したいのですが、失敗します:
data <- data.table(va, vb, vc)
> Error in data.table(va, vb, vc) : object 'va' not found
次に、それにデータテーブルを追加したいのですが、それも失敗します:
data2 <- data.table(va=c(-1,0,1), vb=c(-1,0,1), vc=c(-1,0,1))
data2
va vb vc
1: -1 -1 -1
2: 0 0 0
3: 1 1 1
merge(data2,data2)
> Error in merge.data.table(data2, data2) :
Can not match keys in x and y to automatically determine appropriate `by` parameter. Please set `by` value explicitly.
どうやら、関数は2つの同一のデータテーブルでby
パラメーターを識別できません。何か案が?
空のdata.table
を作成を使用(すべての列が数値であると仮定):
library(data.table)
data <- data.table(va=numeric(), vb=numeric(), vc=numeric())
data
結果:
> data
Empty data.table (0 rows) of 3 cols: va,vb,vc
すべての列で自己結合を行うを使用します(結果が同じであっても;-):
data2 <- data.table(va=c(-1,0,1), vb=c(-1,0,1), vc=c(-1,0,1))
data2
merge(data2, data2,by=names(data2))
by
パラメーターを指定する必要がある理由は、merge
の文書化されたセマンティクスです。
によって:
マージするxおよびyの共有列名のベクトル。これは、2つのテーブル間の共有キー列にデフォルト設定されます。 yにキー列がない場合、これはデフォルトでxのキーになります。
キーを設定していないため、データテーブルをマージするための「結合」列は不明確です。
by
パラメーターを省略した場合、暗黙的な「すべての列を使用」セマンティクスはありません(上記のように、共有キー列が使用されます)。
すべての行を追加 data.tableの別の行に、rbind
の代わりにmerge
( "row bind")を使用します。
data3 <- rbind(data2, data2)
data3
結果:
> data3
va vb vc
1: -1 -1 -1
2: 0 0 0
3: 1 1 1
4: -1 -1 -1
5: 0 0 0
6: 1 1 1
空のdata.tableを作成するには、空のマトリックスから開始できます。
library(data.table)
data <- setNames(data.table(matrix(nrow = 0, ncol = 3)), c("va", "vb", "vc"))
data
Empty data.table (0 rows) of 3 cols: va,vb,vc
次に、rbindlist
を使用して、新しいdata.tableを追加できます。
data2=data.table(va=c(-1,0,1), vb=c(-1,0,1), vc=c(-1,0,1))
data2
va vb vc
1: -1 -1 -1
2: 0 0 0
3: 1 1 1
rbindlist(list(data, data2))
va vb vc
1: -1 -1 -1
2: 0 0 0
3: 1 1 1
または、さらに簡単に、以下も機能します。
data <- data.table()
data <- rbindlist(list(data, data2))
data
va vb vc
1: -1 -1 -1
2: 0 0 0
3: 1 1 1
データ型を定義せずに、定義された列名で空のdata.tableを作成する別の方法:
_data <- data.table(1)[,`:=`(c("va", "vb", "vc"),NA)][,V1:=NULL][.0]
_
これは次のことを行います
data.table(1)
:列を追加できる_NULL
以外のdata.tableを作成しますV1
_があります。値_1
_1
_の代わりに任意の値(NULL
以外)を使用できます[,`:=`(c("va", "vb", "vc"),NA)]
:列の追加va
、vb
、vc
V1
_で始まる)と1つの行があります。値_1,NA,NA,NA
_NULL
以外の値を使用できます[,V1:=NULL]
_:_V1
_列を削除します[.0]
_:空白行を返します_[.0]
_の黒魔術が気に入らない場合は、
_data <- data.table(1)[,`:=`(c("va", "vb", "vc"),NA)][,V1:=NULL][!is.na(va)]
_