Как добраться до длинной структуры данных с объединением? - PullRequest
0 голосов
/ 29 апреля 2019

Я пытаюсь получить длинный набор данных с помощью объединений:

tibble::tribble(
         ~country,             ~fit, ~ country_iso, ~year,
    "Afghanistan",  1.56598484506948, "AFG", "2017",
         "Angola", -1.68805891716096, "AGO", "2017",
        "Albania", 0.865738438573542, "ALB", "2017",
    "Afghanistan",  1.42313952299157, "AFG", "2014",  
    "Angola", -0.889994054489868, "AGO", "2014",
    "Albania", 0.162782415602255, "ALB", "2014"
    )
#> # A tibble: 6 x 4
#>   country        fit country_iso year 
#>   <chr>        <dbl> <chr>       <chr>
#> 1 Afghanistan  1.57  AFG         2017 
#> 2 Angola      -1.69  AGO         2017 
#> 3 Albania      0.866 ALB         2017 
#> 4 Afghanistan  1.42  AFG         2014 
#> 5 Angola      -0.890 AGO         2014 
#> 6 Albania      0.163 ALB         2014

Возможно ли сделать это напрямую с помощью объединений?Вот наборы данных, которые необходимо объединить:

library(tidyverse)
values_2017 <- tibble::tribble(
                  ~country,               ~fit,  ~year,
             "Afghanistan",   1.56598484506948, "2017",
                  "Angola",  -1.68805891716096, "2017",
                 "Albania",  0.865738438573542, "2017"
             )

meta <- tibble::tribble(
    ~country_iso,               ~country,
           "AFG",          "Afghanistan",
           "AGO",               "Angola",
           "ALB",              "Albania"
    )

values_2014 <- tibble::tribble(
    ~country_iso,  ~year,               ~fit,
           "AFG", "2014",   1.42313952299157,
           "AGO", "2014", -0.889994054489868,
           "ALB", "2014",  0.162782415602255
    )

Первый шаг при соединении метаданных с первым набором данных дает ожидаемый результат:

values_2017 %>% 
    left_join(meta) 
#> Joining, by = "country"
#> # A tibble: 3 x 4
#>   country        fit year  country_iso
#>   <chr>        <dbl> <chr> <chr>      
#> 1 Afghanistan  1.57  2017  AFG        
#> 2 Angola      -1.69  2017  AGO        
#> 3 Albania      0.866 2017  ALB

Но мне не удается выполнитьследующий шаг, и я чувствую, что не могу понять, что требуется концептуально:

values_2017 %>% 
    left_join(meta) %>% 
    full_join(values_2014, by = "country_iso")
#> Joining, by = "country"
#> # A tibble: 3 x 6
#>   country      fit.x year.x country_iso year.y  fit.y
#>   <chr>        <dbl> <chr>  <chr>       <chr>   <dbl>
#> 1 Afghanistan  1.57  2017   AFG         2014    1.42 
#> 2 Angola      -1.69  2017   AGO         2014   -0.890
#> 3 Albania      0.866 2017   ALB         2014    0.163

values_2017 %>% 
    left_join(meta) %>% 
    left_join(values_2014, by = "country_iso")
#> Joining, by = "country"
#> # A tibble: 3 x 6
#>   country      fit.x year.x country_iso year.y  fit.y
#>   <chr>        <dbl> <chr>  <chr>       <chr>   <dbl>
#> 1 Afghanistan  1.57  2017   AFG         2014    1.42 
#> 2 Angola      -1.69  2017   AGO         2014   -0.890
#> 3 Albania      0.866 2017   ALB         2014    0.163

Как я должен думать об этом?

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Вы можете сделать full_join после left_join с meta для обоих кадров данных.

library(dplyr)

values_2014 %>% left_join(meta) %>%
  full_join(values_2017 %>% left_join(meta))

# country_iso year     fit country    
#  <chr>       <chr>  <dbl> <chr>      
#1 AFG         2014   1.42  Afghanistan
#2 AGO         2014  -0.890 Angola     
#3 ALB         2014   0.163 Albania    
#4 AFG         2017   1.57  Afghanistan
#5 AGO         2017  -1.69  Angola     
#6 ALB         2017   0.866 Albania    
0 голосов
/ 29 апреля 2019

Вы можете использовать bind_rows:

library(dplyr)

bind_rows(
    values_2014 %>% left_join(meta),
    values_2017 %>% left_join(meta)
)

Выход:

# A tibble: 6 x 4
  country        fit year  country_iso
  <chr>        <dbl> <chr> <chr>      
1 Afghanistan  1.57  2017  AFG        
2 Angola      -1.69  2017  AGO        
3 Albania      0.866 2017  ALB        
4 Afghanistan  1.42  2014  AFG        
5 Angola      -0.890 2014  AGO        
6 Albania      0.163 2014  ALB  
...