我正在尝试通过单独的键连续合并两个数据集。
我不能一次使用所有三个键,因为数据缺少值和错误。例如,某人的名字在一个名字中是“ 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))
答案 0 :(得分:0)
发表评论的时间有点长,尽管我担心这只是想法列表,而不是解决方案。 @Marcus的fuzzyjoin
提出了一个很好的建议,它可以解决很多问题。
我在类似数据集上的经验是,您可能需要创建一个具有真正“不可替代”等价关系的附加列,在您的情况下,可能是name
(例如Bobby for Robert)。希望这会很少。
与上述方法结合或替代的另一种策略是采用一个meant to be sequential(company.id
?)的数字变量,并尽可能多地依赖它。
最后一点是,它们的关键是您自己对什么数据可靠和什么不是可靠的了解。如果不确定,这可能是不可能的任务。
哦,如果您有空间信息,请记住还有sf::st_join
和其他信息。