У меня есть два кадра данных 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
Вы можете развернуться на длинную позицию, затем присоединиться, а затем развернуться назад:
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
Проверьте редактирование. Вы должны изменить шаблон в names_pattern
Спасибо! Однако теперь у меня 6 строк вместо оригинальных 3 из df_1. Я по-прежнему хочу, чтобы переменные Team_2 находились в той же первой строке, что и Team_1, чтобы всего было только 3 строки, но с добавленными новыми столбцами из df_2. Смотрите мой пример вывода.
Нет, есть 3 строки с обоими решениями
Я запускаю код ввода, как я указал выше, вместе с вашим кодом редактирования, и для nrow() я получаю 6.
Проверьте свою dplyr версию. Если у вас 1.0.10 или ниже, обновите
Вот и все! Большое спасибо за помощь и терпение!
Еще один вопрос: как мне отредактировать код, если df_1 имеет дополнительный столбец под названием «Компания»? Поскольку этого нет в шаблоне «Team_», есть ли способ как-то сохранить этот исходный столбец?
Я вижу, что вы создали еще один вопрос. это хорошая практика, поэтому я отвечу там, а не здесь
Идеально, большое спасибо!
Спасибо @Mael, я немного отредактировал свои входные данные, чтобы они больше походили на мои входные данные - я пытался настроить ваш код, но не смог в нем разобраться, не могли бы вы помочь мне с настройкой?