Попытка сделать значения двух фреймов данных соответствующими парам R - PullRequest
0 голосов
/ 06 августа 2020

У меня есть два фрейма данных, в которых я хотел бы объединить на основе кода страны.

Например, мои данные выглядят следующим образом:

x = data.frame("countryCode" = c("AD", "AE", "AF", "AT", "BA"), "lang" = c("Catalan", "Arabic", "Dari", "German", "Romani"), "langCountryPop" = c(31000, 744000, 5600000, 7500000, 400000), "lat" = c(41.75,26,35,52, 45), "lon" = c(2,49,66,10,21))

y = data.frame("iso2_x" = c("AE", "AT", "BA"), "iso2_y" = c("AD", "AF", "AE"), "distance" = c(1243213, 1234123, 45423535))

Я хотел бы объединить X с Y так что теперь Y выглядит так:

y = data.frame("iso2_x" = c("AE", "AT", "BA"), "lang" = c("Arabic", "German", "Romani"), "lat" = c(26,52,45), "lon" = c(49,10,21), "iso2_y" = c("AD", "AF", "AE"), "lang" = c("Catalan", "Dari", "Arabic"), "lat" = c(41.75,35,26), "lon" = c(2,66,49), "distance" = c(1243213, 1234123, 45423535))

Как я могу сопоставить столбец «countryCode» от X со столбцами «iso2_x» и «iso2_y» в Y и добавить соответствующие столбцы от X до Y ? Спасибо

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Вы можете использовать только два соединения ...

x <- data.frame("countryCode" = c("AD", "AE", "AF", "AT", "BA"), "lang" = c("Catalan", "Arabic", "Dari", "German", "Romani"), "langCountryPop" = c(31000, 744000, 5600000, 7500000, 400000), "lat" = c(41.75,26,35,52, 45), "lon" = c(2,49,66,10,21))
y <- data.frame("iso2_x" = c("AE", "AT", "BA"), "iso2_y" = c("AD", "AF", "AE"), "distance" = c(1243213, 1234123, 45423535))


library(dplyr)

y %>% 
  left_join(x, by = c('iso2_x' = 'countryCode')) %>% 
  left_join(x, by = c('iso2_y' = 'countryCode'), suffix = c('', '_y'))
#>   iso2_x iso2_y distance   lang langCountryPop lat lon  lang_y langCountryPop_y
#> 1     AE     AD  1243213 Arabic         744000  26  49 Catalan            31000
#> 2     AT     AF  1234123 German        7500000  52  10    Dari          5600000
#> 3     BA     AE 45423535 Romani         400000  45  21  Arabic           744000
#>   lat_y lon_y
#> 1 41.75     2
#> 2 35.00    66
#> 3 26.00    49
0 голосов
/ 06 августа 2020

попробуйте так

   library(tidyverse)
    y %>% 
      pivot_longer(-distance, names_sep = "_", names_to = c(".value", "set")) %>% 
      left_join(x, by = c("iso2" = "countryCode")) %>% 
      pivot_wider(distance, 
                  names_from = set,
                  values_from = c(iso2, lang, lat, lon)) %>% 
      select(ends_with("_x"), ends_with("_y"), distance)

# A tibble: 3 x 9
  iso2_x lang_x lat_x lon_x iso2_y lang_y  lat_y lon_y distance
  <chr>  <chr>  <dbl> <dbl> <chr>  <chr>   <dbl> <dbl>    <dbl>
1 AE     Arabic    26    49 AD     Catalan  41.8     2  1243213
2 AT     German    52    10 AF     Dari     35      66  1234123
3 BA     Romani    45    21 AE     Arabic   26      49 45423535
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...