2016-05-11 16 views
2

2つの大きなデータセットがあります。 1つは古いもので、もう1つは最初のものとほぼ同じです。違いは、2番目の行に新しい行があり、最初のデータセットと比較してValueと行が欠落している点です。 新しいデータセットにすべてを残しておき、古いデータセットに存在する欠落行(DateCodeの組み合わせ)で埋めたいと思います。順序は重要ではありません。2行分のデータフレームを入力しないでください

古いデータ・セット:

   Date Code Value 
     2015-10-01 1 145 
     2015-10-01 1 175 
     2015-11-01 6 112 
     2015-12-01 2 160 
     2016-01-01 6 124 
     2016-01-01 6 572 
     2016-02-01 5 160 
     2016-02-01 1 574 

新しいデータセット:

   Date Code Value 
     2015-10-01 1 145 
     2015-10-01 2 1452 
     2015-11-01 6 125 
     2015-12-01 2 160 
     2016-01-01 6 1501 
     2016-01-01 6 572 
     2016-03-01 9 452 
     2016-03-01 7 500 

出力:

   Date Code Value 
     2015-10-01 1 145 
     2015-10-01 2 1452 
     2015-11-01 6 125 
     2015-12-01 2 160 
     2016-01-01 6 1501 
     2016-01-01 6 572 
     2016-03-01 9 452 
     2016-03-01 7 500 
     2015-10-01 1 175 
     2016-02-01 5 160 
     2016-02-01 1 574 

DateCodeから対応する行の一致する組み合わせが存在しません古いデータセットを追加する必要があります。 出力では、最後の3行は古いデータセットに由来します。私は必要なものを見つけるために運がない別の記事を見てきました。

答えて

0

の出力は、あなたはnew_dfに

df <- anti_join(old_df,new_df,by=c("date","code","value")) 
     date code value 
1 2016-01-01 6 124 
2 2016-02-01 1 574 
3 2016-02-01 5 160 
4 2015-10-01 1 175 
5 2015-11-01 6 112 
final_df <- full_join(df,new_df,by=c("date","code","value")) 
     date code value 
1 2016-01-01 6 124 
2 2016-02-01 1 574 
3 2016-02-01 5 160 
4 2015-10-01 1 175 
5 2015-11-01 6 112 
6 2015-10-01 1 145 
7 2015-10-01 2 1452 
8 2015-11-01 6 125 
9 2015-12-01 2 160 
10 2016-01-01 6 1501 
11 2016-01-01 6 572 
12 2016-03-01 9 452 
13 2016-03-01 7 500 
+0

'final_df < - anti_join(oldds、newds、by = c(" Date "、" Code "))'のままにしておく必要があります。この行は 'Code'だけが変更された' 2015-10-01 1 175 'です。さらに、この警告メッセージ「さまざまなレベルの要素を結合し、文字ベクトルに強制する」 – noblabla

+0

わかりました。私が何をしたのか分かります。まず、anti_joinは答えの一部を返します。私は私の答えを編集します。 – theArun

+0

警告を受け取っている理由は、日付列が、あなたの日付列でas.character()を使用して変更できる要素として設定されている可能性があるためです。 – theArun

1

あなたはこの

key.new <- with(newds, interaction(Date, Code, Value)) 
key.old <- with(oldds, interaction(Date, Code, Value)) 

が、その後

ind <- match(key.old, key.new, nomatch=0) == 0 

はあなたに私が正しく質問を理解していれば、新しい 1に追加すべき古いデータ・セットから行を与える行うことができます。余談注意点として

> oldds[ind, ] 
     Date Code Value 
2 2015-10-01 1 175 
3 2015-11-01 6 112 
5 2016-01-01 6 124 
7 2016-02-01 5 160 
8 2016-02-01 1 574 

、あなたが、例えばと を操作しているデータを再作成するためのコマンドを含めて、最小限の再現性 例を提供することをお勧めします dput(oldds)dput(newds)または

oldds <- 
read.table(text=' 
      Date Code Value 
    2015-10-01 1 145 
    2015-10-01 1 175 
    2015-11-01 6 112 
    2015-12-01 2 160 
    2016-01-01 6 124 
    2016-01-01 6 572 
    2016-02-01 5 160 
    2016-02-01 1 574 
', header=TRUE) 

newds <- 
read.table(text=' 
      Date Code Value 
    2015-10-01 1 145 
    2015-10-01 2 1452 
    2015-11-01 6 125 
    2015-12-01 2 160 
    2016-01-01 6 1501 
    2016-01-01 6 572 
    2016-03-01 9 452 
    2016-03-01 7 500 
', header=TRUE) 
+1

はい、値の存在しないold_df内のすべての行を見つけるために、dplyrライブラリからanti_join機能を使用することができます行3と5は新しいデータセットで更新されており、 – noblabla

関連する問題