web-dev-qa-db-ja.com

列名を持つ空のデータテーブルを作成し、それにデータテーブルを追加する方法は?

最初に、列名を持つ空のデータテーブルを作成したいのですが、失敗します:

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パラメーターを識別できません。何か案が?

15
ChiseledAbs

空の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
18
R Yoda

空の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
14
Psidom

データ型を定義せずに、定義された列名で空のdata.tableを作成する別の方法:

_data <- data.table(1)[,`:=`(c("va", "vb", "vc"),NA)][,V1:=NULL][.0]
_

これは次のことを行います

  1. data.table(1):列を追加できる_NULL以外のdata.tableを作成します
    • 1つの行を持つ1つの列_V1_があります。値_1_
    • _1_の代わりに任意の値(NULL以外)を使用できます
  2. [,`:=`(c("va", "vb", "vc"),NA)]:列の追加vavbvc
    • 現在、4つの列(_V1_で始まる)と1つの行があります。値_1,NA,NA,NA_
    • NAの代わりにNULL以外の値を使用できます
  3. _[,V1:=NULL]_:_V1_列を削除します
  4. _[.0]_:空白行を返します
    • 実際には[.n]を使用できます。ここでnは任意の整数です。

_[.0]_の黒魔術が気に入らない場合は、

_data <- data.table(1)[,`:=`(c("va", "vb", "vc"),NA)][,V1:=NULL][!is.na(va)]
_
2
mpag