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

У меня есть два кадра данных 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
Конечные и Readonly классы в PHP
Конечные и Readonly классы в PHP
В прошлом, когда вы не хотели, чтобы другие классы расширяли определенный класс, вы могли пометить его как final.
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
БЭМ: Конвенция об именовании CSS
БЭМ: Конвенция об именовании CSS
Я часто вижу беспорядочный код CSS, особенно если проект большой. Кроме того, я совершал эту ошибку в профессиональных или личных проектах и...
Революционная веб-разработка ServiceNow
Революционная веб-разработка ServiceNow
В быстро развивающемся мире веб-разработки ServiceNow для достижения успеха крайне важно оставаться на вершине последних тенденций и технологий. По...
Как добавить SEO(Search Engine Optimization) в наше веб-приложение и как это работает?
Как добавить SEO(Search Engine Optimization) в наше веб-приложение и как это работает?
Заголовок веб-страницы играет наиболее важную роль в SEO, он помогает поисковой системе понять, о чем ваш сайт.
Конфигурация Jest в angular
Конфигурация Jest в angular
В этой статье я рассказываю обо всех необходимых шагах, которые нужно выполнить при настройке jest в angular.
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

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