Как выполнить внешнее левое соединение для нескольких столбцов с помощью цикла?

У меня есть два кадра данных df_1 и df_2, на которых я хочу выполнить внешнее левое соединение. Однако df_1 имеет несколько столбцов (более 70), названных одинаково (например, Team_URL_1, Team_URL_2 и т. д.), содержащих URL-адреса, которые я хочу объединить с одним столбцом из df_2.

Как выполнить внешнее левое соединение для этих столбцов с помощью цикла, чтобы мне не приходилось кодировать все столбцы URL_ вручную?

Входные dfs выглядят следующим образом (с более чем 70 столбцами Team_URL_ в реальном фрейме данных):

df_1 <- data.frame (Team_1  = c("wrg", "werg", "sdf"),
                    Team_Desc_1  = c("wer", "wtrb", "wergt"),
                    Team_URL_1 = c("ewrg", "werg", "asd"),
                    Team_Ver_1  = c("25", "2523", "342"),
                    Team_Num_1 = c("aed", "jfsa", "vsf"),
                    Team_Value_1 = c("aed", "jfsa", "vsf"),
                    Team_2  = c("werh", "wtt", "qwe"),
                    Team_Desc_2  = c("sdfg", "wer", "sdfgv"),
                    Team_URL_2 = c("qwe", "gvre", "vrw"),
                    Team_Ver_2  = c("4123", "5133", "4126"),
                    Team_Num_2 = c("aefbvd", "jfswreta", "vsefwf"),
                    Team_Value_2 = c("aewed", "jfsbwa", "vsbf")
)

df_2 <- data.frame (Name  = c("etwbv", "werg", "sdfg", "qwreg", "gvr", "wref"),
                    URL = c("ewrg", "werg", "asd", "qwe", "gvre", "vrw"),
                    Txt = c("abc", "bfh", "fse", "rege", "wer", "vwr"),
                    Head = c("abc1", "bfh", "fse", "rege1", "wer", "vwr")
)

Вывод должен выглядеть следующим образом (упорядочите столбцы, содержащие соответствующее число, в правильном порядке и переименуйте их, добавив «_x», где x будет соответствующим значением):

  Column_name_1  Column_URL_1  Name_1  Txt_1  Column_name_2  Column_URL_2  Name_2  Txt_2
1       value_1         URL_1   val_1    abc        value_4         URL_4   val_4   rege
2       value_2         URL_2   val_2    bfh        value_5         URL_5   val_5    wer
3       value_3         URL_3   val_3    fse        value_6         URL_6   val_6    vwr
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете развернуться на длинную позицию, затем присоединиться, а затем развернуться назад:

library(tidyr)
library(dplyr)

df_1 %>%
  pivot_longer(everything(), names_to = c(".value", "id"), names_pattern = "(Column_URL|Column_name)_(\\d)") %>% 
  left_join(df_2, by = c("Column_URL" = "URL")) %>% 
  mutate(row_id = row_number(), .by = id) %>% 
  pivot_wider(names_from = id, values_from = Column_name:Txt, names_vary = "slowest") %>% 
  select(-row_id)

  Column_name_1 Column_URL_1 Name_1 Txt_1 Column_name_2 Column_URL_2 Name_2 Txt_2
1 value_1       URL_1        val_1  abc   value_4       URL_4        val_4  rege 
2 value_2       URL_2        val_2  bfh   value_5       URL_5        val_5  wer  
3 value_3       URL_3        val_3  fse   value_6       URL_6        val_6  vwr  

Редактировать:

df_1 %>%
  pivot_longer(everything(), names_to = c(".value", "id"), names_pattern = '(.*)_(\\d)$') %>% 
  left_join(df_2, by = c("Team_URL" = "URL")) %>% 
  mutate(row_id = row_number(), .by = id) %>% 
  pivot_wider(names_from = id, values_from = Team:Head, names_vary = "slowest") %>% 
  select(-row_id)

  Team_1 Team_Des…¹ Team_…² Team_…³ Team_…⁴ Team_…⁵ Name_1 Txt_1 Head_1 Team_2 Team_…⁶ Team_…⁷ 
1 wrg    wer        ewrg    25      aed     aed     etwbv  abc   abc1   werh   sdfg    qwe    
2 werg   wtrb       werg    2523    jfsa    jfsa    werg   bfh   bfh    wtt    wer     gvre   
3 sdf    wergt      asd     342     vsf     vsf     sdfg   fse   fse    qwe    sdfgv   vrw    

Спасибо @Mael, я немного отредактировал свои входные данные, чтобы они больше походили на мои входные данные - я пытался настроить ваш код, но не смог в нем разобраться, не могли бы вы помочь мне с настройкой?

Soph2010 15.02.2023 14:23

Проверьте редактирование. Вы должны изменить шаблон в names_pattern

Maël 15.02.2023 14:34

Спасибо! Однако теперь у меня 6 строк вместо оригинальных 3 из df_1. Я по-прежнему хочу, чтобы переменные Team_2 находились в той же первой строке, что и Team_1, чтобы всего было только 3 строки, но с добавленными новыми столбцами из df_2. Смотрите мой пример вывода.

Soph2010 15.02.2023 14:46

Нет, есть 3 строки с обоими решениями

Maël 15.02.2023 14:54

Я запускаю код ввода, как я указал выше, вместе с вашим кодом редактирования, и для nrow() я получаю 6.

Soph2010 15.02.2023 15:02

Проверьте свою dplyr версию. Если у вас 1.0.10 или ниже, обновите

Maël 15.02.2023 15:14

Вот и все! Большое спасибо за помощь и терпение!

Soph2010 15.02.2023 15:54

еще один вопрос: как мне отредактировать код, если df_1 имеет дополнительный столбец под названием «Компания»? Поскольку этого нет в шаблоне «Team_», есть ли способ как-то сохранить этот исходный столбец?

Soph2010 22.02.2023 15:50

Я вижу, что вы создали еще один вопрос. это хорошая практика, поэтому я отвечу там, а не здесь

Maël 22.02.2023 16:04

Идеально, большое спасибо!

Soph2010 22.02.2023 16:06

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