Объединить два фрейма данных, используя идентификатор и соответствующую строку - PullRequest
0 голосов
/ 20 октября 2018

Предположим, у меня есть 2 фрейма данных:

df1 <- data.frame(eventId = c("6770583", "6770529"), home = c("Real Salt Lake", "Vancouver Whitecaps Fc"), away = c("New England Revolution", "Sporting Kansas City"))

df2 <- data.frame(eventId = c("6770583", "6770583", "6770529", "6770529"), currentOddType = c("New England Revolution to win 1-0, 2-0 or 2-1", "Real Salt Lake to win 1-0, 2-0 or 2-1", "Sporting Kansas City to win 1-0, 2-0 or 2-1", "Vancouver Whitecaps to win 1-0, 2-0 or 2-1"), currentOdds = c("7", "4", "4.33", "4.5"))

Я хочу объединить их, используя eventId и имя команды, потому что eventId повторяется в df2.

Желаемый результат будет выглядеть следующим образом:

dfFinal <- data.frame(eventId = c("6770583", "6770529"), home = c("Real Salt Lake", "Vancouver Whitecaps Fc"), away = c("New England Revolution", "Sporting Kansas City"), homeOdd = c("4", "4.5"), awayOdd = c("7", "4.33"))

dfFinal

Кроме того, там, где нет совпадений, homeOdd и awayOdd будут "NA"«

1 Ответ

0 голосов
/ 20 октября 2018

Мы можем использовать комбинацию gather / spread с left_join

df1 %>%
    gather(type, team, -eventId) %>%
    left_join(
        df2 %>%
            separate(currentOddType, into = c("team", "type"), sep = "\\s(?=to win)") %>%
            select(eventId, team, currentOdds),
        by = c("eventId", "team")) %>%
    unite(val, team, currentOdds) %>%
    spread(type, val) %>%
    separate(away, into = c("away", "awayOdd"), sep = "_") %>%
    separate(home, into = c("home", "homeOdd"), sep = "_")
#  eventId                   away awayOdd                   home homeOdd
#1 6770529   Sporting Kansas City    4.33 Vancouver Whitecaps Fc      NA
#2 6770583 New England Revolution       7         Real Salt Lake       4

Обратите внимание, что Vancouver Whitecaps Fc становится NA, поскольку имена в df1 и df2разные (Vancouver Whitecaps Fc против Vancouver Whitecaps).

...