Объединение фреймов данных с помощью отношений «многие ко многим» в R

Я пытаюсь объединить два кадра данных в 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

Готов поспорить, что упускаю что-то простое, но не могу понять, что именно. Любой совет очень ценится!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
54
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

вы можете использовать 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   

Именно то, что я искал, спасибо, Томас!

Gavin 15.08.2024 16:33

Я предполагаю, что вы захотите соединить первую строку в 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

Спасибо, действительно полезное прохождение! Я собираюсь принять ответ Томаса, потому что он немного ближе к окончательному решению, которое мне нужно. Хотя оцените это :)

Gavin 15.08.2024 16:02

Глядя на ваш пример данных, кажется, что простого 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", чтобы код был кратким :)

ThomasIsCoding 15.08.2024 09:26

Я определенно слишком усложнил задачу, спасибо за это!

Gavin 15.08.2024 16:03

Другие вопросы по теме