Объединение наборов данных, когда значения ключей не согласованы - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь объединить два набора данных по отдельным ключам последовательно.

Я не могу использовать все три ключа одновременно, потому что в данных отсутствуют значения и ошибки.Например, имя для кого-то будет «Мэри» в одном и «М» в другом.

См. Пример данных:

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 выбрасывает другой столбец для идентификаторов, которые он не распознал ...

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))   

Обратите внимание, что в моем результате пропущенное значение для идентификатора компании было заменено, полные имена исправлены, а неправильный номер паспорта был проигнорировани заменил на правильный!

Спасибо за помощь !!!:) Я бы предпочел dplyr решение, но я бы тоже принял любой другой совет!


РЕДАКТИРОВАТЬ

Мне не удалось выяснить 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))

Это один из возможных результатов, который я хотел бы заменить, вместо всех отсутствующих, ошибочных значений данных на правильные значения данных1.

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 голосов
/ 15 февраля 2019

Это было немного долго для комментария, хотя я боюсь, что это просто список идей, а не решение.@ Marcus's предлагает отличное предложение с fuzzyjoin, которое должно исправить большое количество проблем.

Мой опыт работы с подобными наборами данных заключается в том, что вам может понадобиться создать дополнительный столбец с действительно «нерегулярными» эквивалентностями в вашемдело, вероятно, name (например, Бобби для Роберта).Надеюсь, этого будет мало.

Другая стратегия, объединяющая или заменяющая вышеперечисленным, заключается в том, чтобы взять числовую переменную , которая должна быть последовательной (company.id?), И полагаться на нее какНасколько это возможно.

И последнее, что они имеют ключевое значение - это ваше собственное знание о том, какие данные надежны, а какие нет.Если вы не уверены, это может быть невыполнимой задачей.

О, и если у вас есть пространственная информация, помните, что есть также sf::st_join и другие.

...