如何通过连接获得长数据结构?

问题描述 投票:0回答:2

我正在尝试使用连接来实现长数据集:

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

我该怎么想这个?

r dplyr left-join
2个回答
1
投票

你可以在full_joinleft_joining之后为两个数据帧做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
投票

你可以使用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  
© www.soinside.com 2019 - 2024. All rights reserved.