当键的值不一致时合并数据集

时间:2019-02-14 19:22:04

标签: r dplyr left-join

我正在尝试通过单独的键连续合并两个数据集。

我不能一次使用所有三个键,因为数据缺少值和错误。例如,某人的名字在一个名字中是“ Mary”,在另一个名字中是“ M”。

查看此示例数据:

data1 <- data.frame(name = c("Mary", "John", "Christoper", "Vijay", "Jack", "Clancy"), 
                    company.id = c("3489", "8796", "7283", "9834", "3453", "4354"),
                    passport = c("A74638", NA, "A34679", "A34768", "B34353", "33452"),
                    var1 = c(3, 6, 7, 9, 7, 9), 
                    var2 = c(343, 354, 874, 203, 423, 567), 
                    va3 = c(4545,6767,2345, 6580, NA, 32456)) 


data2 <-  data.frame(name = c("M", "John", "Christoper", "Vij"), 
                     company.id = c("3489", "8796", "7283", NA),
                     passport = c("A74638", "B38746", "A3460", "A34768"),
                     var4 = c("apple", "bannana", "yogh", "shampoo"), 
                     var5 = c(4566, 4562, 7869, 5485))

理想情况下,我会通过调用三个通用键来使用左联接。但是在这种情况下,名称并不完全匹配,company.id中存在拼写错误,并且缺少值,因此这并不能达到预期的效果。

merged <-
data1 %>% left_join(data2, by = c("name", "company.id", "passport"))

这也不起作用,因为当我将其与一个数据集结合时,R会为ID喷出另一列,因为它无法识别...

merged2 <- data1 %>% left_join(data2, by= "name") %>% 
                       left_join(data2, by ="company.id") %>%
                          left_join(data2, by = "passport")

任何解决此难题的建议将不胜感激。这就是我想要的样子:

outcome <- data.frame(name = c("Mary", "John", "Christoper", "Vijay"), 
                      company.id = c("3489", "8796", "7283", "9834"),
                      passport = c("A74638", "B38746", "A34679", "A34768"),
                      var1 = c(3, 6, 7, 9),
                      var2 = c(343, 354, 874, 203),
                      va3 = c(4545,6767,2345, 6580),
                      var4 = c("apple", "bannana", "yogh", "shampoo"), 
                      var5 = c(4566, 4562, 7869, 5485))   

请注意,在我的结果中,公司ID的缺失值已被替换,姓名被更正,而错误的护照号已被忽略,并用正确的护照号替换!

感谢您的帮助!!! :)我更希望使用dplyr解决方案,但我也会接受其他建议!


EDIT

我无法找出Fuzzy_join来完成上述输出。这是两个可能的结果,它们将同样有用。

在这种情况下,data1在三个匹配的键中具有完全可靠的数据:名称,company.id和护照号码。所以我想将data1匹配到data2 ...,其中data2是唯一缺少值/错位的数据集。

是否有更直接的解决方法?

data1 <- data.frame(name = c("Mary", "John", "Christoper", "Vijay", "Jack", "Clancy"), 
                    company.id = c("3489", "8796", "7283", "9834", "3453", "4354"),
                    passport = c("A74638", "B38746", "A34679", "A34768", "B34353", "B33452"),
                    var1 = c("3", "6", "7", "9", "7", "9"), 
                    var2 = c("343", "354", "874", "203", "423", "567"), 
                    var3 = c(4545,6767,2345, 6580, NA, 32456)) 



data2 <-  data.frame(name = c("M", "John", "Christoper", "Vij"), 
                     company.id = c("3489", "8796", "7283", NA),
                     passport = c("A74638", "B38746", "A3460", "A34768"),
                     var4 = c("apple", "bannana", "yogh", "shampoo"), 
                     var5 = c(4566, 4562, 7869, 5485))

这是我想要的一种可能的结果,将所有丢失的,错误的数据值替换为正确的data1值。

outcome <- data.frame(name = c("Mary", "John", "Christoper", "Vijay"), 
                      company.id = c("3489", "8796", "7283", "9834"),
                      passport = c("A74638", "B38746", "A34679", "A34768"),
                      var1 = c("3", "6", "7", "9"),
                      var2 = c("343", "354", "874", "203"),
                      var3 = c("4545","6767","2345", "6580"),
                      var4 = c("apple", "bannana", "yogh", "shampoo"), 
                      var5 = c(4566, 4562, 7869, 5485))

这是另一个可能的结果;合并的数据集不能解决拼写错误和缺少的值,但是至少我可以获得一个完全合并的数据集。...

outcome2 <- data.frame(name = c("M", "John", "Christoper", "Vij"), 
                      company.id = c("3489", "8796", "7283", NA),
                      passport = c("A74638", "B38746", "A34679", "A34768"),
                      var1 = c("3", "6", "7", "9"),
                      var2 = c("343", "354", "874", "203"),
                      var3 = c("4545","6767","2345", "6580"),
                      var4 = c("apple", "bannana", "yogh", "shampoo"), 
                      var5 = c(4566, 4562, 7869, 5485))

1 个答案:

答案 0 :(得分:0)

发表评论的时间有点长,尽管我担心这只是想法列表,而不是解决方案。 @Marcus的fuzzyjoin提出了一个很好的建议,它可以解决很多问题。

我在类似数据集上的经验是,您可能需要创建一个具有真正“不可替代”等价关系的附加列,在您的情况下,可能是name(例如Bobby for Robert)。希望这会很少。

与上述方法结合或替代的另一种策略是采用一个meant to be sequentialcompany.id?)的数字变量,并尽可能多地依赖它。

最后一点是,它们的关键是您自己对什么数据可靠和什么不是可靠的了解。如果不确定,这可能是不可能的任务。

哦,如果您有空间信息,请记住还有sf::st_join和其他信息。