我一直在寻找解决方案并一直在尝试,但似乎无法执行我应该做的简单任务。通过至少两列中的一个匹配合并数据帧
我有两个数据帧格式化类似于下面玩具实例
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
我希望合并这两个数据集,使得输出是:
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 ==“猫”或B ==“小猫”将被映射到列D中的1,任何具有A ==“狗”或B ==“小狗”的行将被映射到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行每行数千行,所以可以缩放的解决方案就是我真正需要的。
你已经取得相当大的你的榜样。小心使它更容易复制/粘贴到R?以下是有关如何执行此操作的一些提示:http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – 2013-04-30 06:25:19
您的示例输出与您的说明不符。不应该列“D”是'c(1,2,2,1)'? – A5C1D2H2I1M1N2O1R2T1 2013-04-30 06:27:49
你完全正确,我已经对此进行了修改以避免混淆。谢谢。 – Starcalibre 2013-04-30 06:40:29