Я пытаюсь объединить два набора данных по отдельным ключам последовательно.
Я не могу использовать все три ключа одновременно, потому что в данных отсутствуют значения и ошибки.Например, имя для кого-то будет «Мэри» в одном и «М» в другом.
См. Пример данных:
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))