8

データが入力された data.table と空の別のテーブルとの間でマージを行うと、結果の data.table に NA 行が 1 つ導入されます。

a = data.table(c=c(1,2),key='c')
b = data.table(c=3,key='c')
b=b[c!=3]
b
# Empty data.table (0 rows) of 1 col: c
merge(a,b,all=T)
#     c
# 1: NA
# 2:  1
# 3:  2

なんで?merge.data.frame の場合と同様に、 data.table の行のみが返されると予想してaいました。

> merge.data.frame(a,b,all=T,by='c')
#  c
#1 1
#2 2
4

4 に答える 4

2

すべて: 論理的; all = TRUE は、all.x = TRUE と all.y = TRUE の両方の設定を保存する省略形です。

all.x : 論理的; TRUE の場合、追加の行が出力に追加されます。y に一致する行がない x の行ごとに 1 つずつ追加されます。これらの行 は、通常 y からの値で埋められる列に「NA」を持ちます。デフォルトは FALSE で、x と y の両方からのデータを含む行のみが出力に含まれます。

all.y : 論理的; 上記の all.x に類似しています。

これは、data.table のドキュメントから取得したものです。詳細については、merge関数の引数の説明を参照してください。

これはあなたの質問に答えると思います。

于 2013-03-22T10:01:43.183 に答える
0

merge.data.frame all=Tは afull outer joinであるため、両方のテーブルのすべてのキーを取得すると予想されるため、マージについて参照してください

于 2013-03-22T10:41:27.487 に答える
0

あなたが定義ab、あなたのやり方で考えれば。を単純に使用するrbind(a,b)と、 の行のみが返されますa

bただし、NULL データ テーブルを他の空でないデータテーブルとマージする場合はa、別の方法があります。異なるループ内で異なるデータテーブルをマージしなければならなかったときに、同様の問題が発生しました。この回避策を使用しました。

  #some loop that returns data.table named a
  #another loop starts
  if(all.equal(a,b<-data.table())==TRUE){
  b<-a
  next
  }
  merge(a,b,c("Factor1","Factor2"))

それは私を助けました、多分それもあなたを助けるでしょう。

于 2013-03-22T09:59:01.887 に答える