Соответствие 2 DF на 2 столбца R - PullRequest
1 голос
/ 28 апреля 2020

Если у меня есть 2 DF с одинаковыми значениями, но в разных порядках, могу ли я создать 3-й DF со значениями 2-го DF, совпадающими с первым?

Пример:

HomeTeam <- c("Liverpool", "Southampton", "Arsenal", "Everton", "Chelsea")
AwayTeam <- c("Burnley", "Brighton", "Man United", "Tottenham", "Man City")

df1 <- tibble(HomeTeam, AwayTeam)

HomeTeam <- c("Southampton", "Arsenal", "Chelsea", "Liverpool", "Everton")
AwayTeam <- c("Brighton", "Man United", "Man City", "Burnley", "Tottenham")


df2 <- tibble(HomeTeam, AwayTeam)


HomeTeam <- c("Liverpool", "Southampton", "Arsenal", "Everton", "Chelsea")
AwayTeam <- c("Burnley", "Brighton", "Man United", "Tottenham", "Man City")

df3 <- tibble(HomeTeam, AwayTeam)

Оба DF состоят из тысяч строк данных, но не в порядке. Спасибо.

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Мы можем left_join / inner_join df1 с df2, чтобы получить df2 данные в том же порядке, что и df1.

dplyr::left_join(df1, df2, by = c("HomeTeam", "AwayTeam"))

# A tibble: 5 x 2
#  HomeTeam    AwayTeam  
#  <chr>       <chr>     
#1 Liverpool   Burnley   
#2 Southampton Brighton  
#3 Arsenal     Man United
#4 Everton     Tottenham 
#5 Chelsea     Man City  
0 голосов
/ 28 апреля 2020

Мы могли бы использовать match, чтобы получить индекс для arrange строк

library(dplyr)
df2 %>% 
    arrange(match(HomeTeam, df1$HomeTeam), match(AwayTeam, df1$AwayTeam))

Кроме того, если есть больше столбцов, может быть лучше paste эти столбцы и выполните один match

library(stringr)
df2 %>%
     arrange(match(str_c(HomeTeam, AwayTeam), str_c(df1$HomeTeam, df1$AwayTeam)))

ПРИМЕЧАНИЕ. Для больших наборов данных match будет потенциально быстрее соединения, поскольку мы извлекаем один столбец или вектор из другого набора данных, который будет использоваться в match


Или другой вариант - data.table соединение, которое также будет быстрым

library(data.table)
setDT(df2)[setDT(df1), on = .(HomeTeam, AwayTeam)]
#     HomeTeam   AwayTeam
#1:   Liverpool    Burnley
#2: Southampton   Brighton
#3:     Arsenal Man United
#4:     Everton  Tottenham
#5:     Chelsea   Man City
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...