Я пытаюсь объединить два кадра данных в R, каждый из которых имеет несколько повторений одного и того же идентификационного номера. Этого следует ожидать в отношении данных и не является проблемой качества данных.
Насколько я понимаю, мне следует выполнить левое соединение между двумя кадрами данных, указать связь «многие ко многим», и это сработает. Однако мои идентификаторы дублируются так, как я этого не ожидал.
Вот некоторые тестовые данные:
test4 <- data.frame(ID = c('A', 'A', 'B', 'B', 'C'), Score = c(1,2,3,4,5))
test5 <- data.frame(ID = c('A', 'A', 'B', 'B', 'C'), Race = c('W','W','B','B','W'))
test6 <- test4 %>% left_join(test5, by = "ID", relationship = "many-to-many")
Это выводит данные следующим образом:
ID Score Race
A 1 W
A 1 W
A 2 W
A 2 W
B 3 B
B 3 B
B 4 B
B 4 B
C 5 W
Когда я хочу, чтобы он выводился так:
ID Score Race
A 1 W
A 2 W
B 3 B
B 4 B
C 5 W
Готов поспорить, что упускаю что-то простое, но не могу понять, что именно. Любой совет очень ценится!
вы можете использовать distinct
перед применением left_join
, например,
test4 %>%
left_join(distinct(test5), by = "ID")
или укажите multiple = "first"
в left_join
test4 %>%
left_join(test5, by = "ID", multiple = "first")
что дает
ID Score Race
1 A 1 W
2 A 2 W
3 B 3 B
4 B 4 B
5 C 5 W
Я предполагаю, что вы захотите соединить первую строку в ID1 с первой строкой в ID1 в других таблицах и т. д. Это может пригодиться, например, если у вас есть несколько таблиц данных о событиях, где каждое событие представляет собой строку. . В этом случае вы можете сохранить все строки каждой таблицы, но убедитесь, что они выровнены и соответствуют идентификатору и событию, соответствующему этому идентификатору.
Но если есть только одна таблица «событий», а в противном случае таблицы содержат повторяющиеся данные для каждого идентификатора, проще использовать подход left_join(... multiple = "first")
, предложенный @ThomasIsCoding.
left_join(test4 |> mutate(row = row_number(), .by = ID),
test5 |> mutate(row = row_number(), .by = ID),
join_by(row, ID))
ID Score row Race
1 A 1 1 W
2 A 2 2 W
3 B 3 1 B
4 B 4 2 B
5 C 5 1 W
Спасибо, действительно полезное прохождение! Я собираюсь принять ответ Томаса, потому что он немного ближе к окончательному решению, которое мне нужно. Хотя оцените это :)
Глядя на ваш пример данных, кажется, что простого merge
достаточно:
> merge(unique(test4), unique(test5), by = "ID")
ID Score Race
1 A 1 W
2 A 2 W
3 B 3 B
4 B 4 B
5 C 5 W
Если данные вашего образца не имитируют имеющиеся данные, пожалуйста, адаптируйте их соответствующим образом.
да, merge
уже должно быть достаточно. Вы даже можете пропустить by = "ID"
, чтобы код был кратким :)
Я определенно слишком усложнил задачу, спасибо за это!
Именно то, что я искал, спасибо, Томас!