私は解決策を探して実験してきましたが、単純なタスクであるべきことを実行できないようです。
以下のおもちゃの例のようにフォーマットされた2つのデータフレームがあります
DF1 = data.frame(A=c("cats","dogs",NA,"dogs"), B=c("kittens","puppies","kittens",NA), C=c(88,99,101,110))
A B C
1 cats kittens 88
2 dogs puppies 99
3 NA kittens 101
4 dogs NA 110
DF2 = data.frame(D=c(1,2), A=c("cats","dogs"), B=c("kittens","puppies"))
D A B
1 1 cats kittens
2 2 dogs puppies
出力が次のようになるように、2 つのデータセットをマージしたいと考えています。
A B C D
1 cats kittens 88 1
2 dogs puppies 99 2
3 dogs NA 110 2
4 NA kittens 101 1
つまり、ラベルが A=="cats" または B=="kittens" の行は列 D の 1 にマップされ、A=="dogs" または B=="puppies" の行はすべてマップされます。 2に。
コマンドを使用しました
merge(DF1, DF2, by=c("A","B"), all.x=TRUE)
ただし、これは行3と4に正しく一致せず、行1と2のみに一致します。出力が得られます
A B C D
1 cats kittens 88 1
2 dogs puppies 99 2
3 dogs NA 110 NA
4 NA kittens 101 NA
私が扱っている実際のデータセットは非常に長いことに注意してください。実際には、DF1 は 1,000,000 行を超え、DF2 は 300,000 行を超え、それぞれ数千行あるため、スケーリングできるソリューションが本当に必要です。