2012-02-15 42 views
6

我有两个数据帧Data1和Data2,我想根据变量“ID”进行合并。合并R中具有常见和不常见示例的两个数据帧

该实施例的数据可以在这里下载:http://dl.dropbox.com/u/52600559/example.RData

这里是第一数据帧:

> Data1 
    ID  Fruit Color Weight 
1 1  Apple Red  5 
2 2 Orange Orange  7 
3 3 Banana Yellow  3 
4 4  Pear Green  5 
5 5 Tomato Red  4 
6 6  Berry Blue  4 
7 7 Mandarin Orange  4 
8 8 Pineapple Yellow  9 
9 9 Nectarine Orange  5 
10 10  Beet Red  5 

这里是第二数据帧:

> Data2 
    ID  Fruit Color Weight 
1 1  Apple Red  5 
2 2  Orange Orange  7 
3 3  Banana Yellow  3 
4 4  Pear Green  5 
5 5  Tomato Red  4 
6 11 Pomegranate Red  6 
7 12  Grape Green  4 
8 13 Cranberry Red  4 
9 14  Melon Pink  5 
10 15  Pumpkin Orange  10 

我试图像这样合并它们:

> merge(Data1, Data2, by = "ID", sort = FALSE, all.x = TRUE, all.y = TRUE) 
    ID Fruit.x Color.x Weight.x  Fruit.y Color.y Weight.y 
1 1  Apple  Red  5  Apple  Red  5 
2 2 Orange Orange  7  Orange Orange  7 
3 3 Banana Yellow  3  Banana Yellow  3 
4 4  Pear Green  5  Pear Green  5 
5 5 Tomato  Red  4  Tomato  Red  4 
6 9 Nectarine Orange  5  <NA> <NA>  NA 
7 6  Berry Blue  4  <NA> <NA>  NA 
8 7 Mandarin Orange  4  <NA> <NA>  NA 
9 8 Pineapple Yellow  9  <NA> <NA>  NA 
10 10  Beet  Red  5  <NA> <NA>  NA 
11 14  <NA> <NA>  NA  Melon Pink  5 
12 11  <NA> <NA>  NA Pomegranate  Red  6 
13 12  <NA> <NA>  NA  Grape Green  4 
14 13  <NA> <NA>  NA Cranberry  Red  4 
15 15  <NA> <NA>  NA  Pumpkin Orange  10 

如您所见,两个数据框都有许多相同的变量。但是,Data1中的某些ID不在Data2中,反之亦然。而且,一些ID位于两个数据帧中。

问题1:我想合并上面显示的所有列。所以,我想将“Fruit.x”与“Fruit.y”合并。放入一个名为“水果”的栏目中。我怎样才能做到这一点?

问题2:如果对于恰好存在于Data1和Data2中的其中一个样本,其中一个值不一致,该怎么办?因此,对于示例ID 1,如果Fruit.x是Apple,但Fruit.y被错误地编码为Aple(拼写错误),有没有办法可以快速检查所有这些实例,以便我可以选择哪一个是正确的?或者我可以告诉R在发生这种情况时始终认为Data1与Data2正确吗?

感谢任何人可以帮助!

+0

谢谢大家的答案! +1给所有人! – Alexander 2012-02-15 20:52:27

回答

10

试试这个:

merge(Data1, Data2, all = TRUE) 

和拼写试试这个地方amatch是近似匹配到fruitnear包含不完全匹配的近似匹配:

for(fruit in Data1$Fruit) { 
    amatch <- agrep(fruit, Data2$Fruit, value = TRUE) 
    near <- amatch[amatch != fruit] 
    if (length(near) > 0) cat(fruit, ":", near, "\n") 
} 

使用提供的数据这给出:

Berry : Cranberry 

编辑:改善代码的清晰度

+0

(+1)不错的拼写检查! – Justin 2012-02-15 17:19:31

2

这应该会让你获得大部分的方式:它会叠加两个数据帧并删除重复的行。

unique(rbind(Data1, Data2)) 

对不起,我没有很好的技巧来处理拼写错误。

3

要回答的问题1:

merge(data1, data2, all=T) 

应该给你你在找什么。它不会处理拼写错误。你将不得不单独处理它们。 unique是寻找它们的好工具,因为tolower可以正常化大小写问题。

相关问题