2016-04-27 6 views
0

私は3つのデータフレームを持っています。他の2つのサブデータフレームをマージする1つの「メイン」データフレーム。最初のマージで一致するデータフレームマージを使用してデータフレームにNAsを埋め込むR

main = data.frame(a = LETTERS[1:5], b = round(rnorm(5),2)) 

a  b 
A 0.41 
B -1.06 
C -0.65 
D -1.27 
E 1.03 

sub1 = data.frame(a = LETTERS[2:4], c = sample(c(100, 200, 300), 3, replace=T)) 

a c 
B 200 
C 200 
D 200 

sub2 = data.frame(a = LETTERS[c(1,5)], c = sample(c(999, 888), 2, replace=T)) 

a c 
A 999 
E 888 

、私は"a"経由mainsub1をマージすると、これは動作します。

merged1 = merge(main, sub1, by="a", all.x=T) 

a  b c 
A 0.41 NA 
B -1.06 300 
C -0.65 300 
D -1.27 100 
E 1.03 NA 

今私はsub2merged1にマージ/参加したいです。私の場合、sub2によって提供される値は、列cのNAsに置き換えられます。具体的には、これらのNAsをsub2の値に置き換えます。私はこれを試してみました(とall.xための他の引数、all.y

merge(merged1, sub2, by="a", all.x=T) 

a  b c.x c.y 
A 0.41 NA 999 
B -1.06 300 NA 
C -0.65 300 NA 
D -1.27 100 NA 
E 1.03 NA 999 

私は、これは、マージして1列のみのCであることを取得できますか

+2

あなたは1)は、彼らが再現しているように、これらのdata.framesを生成するときに、シード番号を設定してご使用くださいでした。 2)命名規則で一貫している...データフレーム "sub1"と "main"を作成しますが、マージで "df_main"と "df_sub1"を使用します。 3)あなたの例を正確にチェックしてください。 df_sub1とsub1は異なります。なぜなら、後者には300が含まれていますが、前者には200しか含まれていないからです。 – AOGSTA

+0

'rbind(df_sub1、df_sub2)'だけで、個々の小さなマージの代わりにマージします。 'rbind'を成功させるには、factorカラムを文字に変換する必要があります。 – Gregor

+0

私は他の唯一の選択肢は[コアレースのような機能](http://stackoverflow.com/q/19253820/903061)で後処理することだと思います。 – Gregor

答えて

4

注:?私の種子が設定された、結果があるので、問題のものとは異なる。

あなたが一緒にあなたSUB1またはSUB2をバインドする場合は、あなたが1つのマージでそれをすべて行うことができます。

set.seed(42) 

main = data.frame(a = LETTERS[1:5], b = round(rnorm(5),2)) 

sub1 = data.frame(a = LETTERS[2:4], c = sample(c(100, 200, 300), 3, replace=T)) 

sub2 = data.frame(a = LETTERS[c(1,5)], c = sample(c(999, 888), 2, replace=T)) 

#Create one data frame 
all_sub <- rbind(sub1,sub2) 

merged <- merge(main, all_sub, by="a", all.x=T) 

出力が期待通りである:

> merged 
    a  b c 
1 A 1.37 999 
2 B -0.56 200 
3 C 0.36 300 
4 D 0.63 300 
5 E 0.40 999 
関連する問題