【问题标题】:Joining multiple dataframes by different columns using a function and map() in R?使用R中的函数和map()通过不同的列连接多个数据框?
【发布时间】:2021-01-26 17:57:15
【问题描述】:

给定三个数据框:

df1 <- data.frame(
  id = c(1:3),
  ctry1 = c("us", "es", "fr"),
  ctry2 = c("ve", "pa", "us"),
  ctry3 = c("co", "co", "es")
)

df2 <- data.frame(
  id = c(1:3),
  ctry1 = c("ve", "ve", "us"),
  ctry2 = c("es", "pa", "us"),
  ctry3 = c("pa", "co", "es")
)

iso <- data.frame(
  ctry = c("us", "es", "fr", "ve", "pa", "ar", "co"),
  iso_ctry = c("840", "724", "250", "862", "591", "032", "170")
)

** 如何将 iso 数据框中的变量 iso_ctrydf1df2 的所有三列连接起来 数据帧?**

它适用于 purrr 中的以下函数和 map(),但我怀疑应该有更快的方法。也许带有一个循环或两个参数的函数。

join_iso <- function(df) { 
  left_join(df, iso, by = c("ctry1" = "ctry")) %>% 
    left_join(iso, by = c("ctry2" = "ctry")) %>% 
    left_join(iso, by = c("ctry3" = "ctry")) %>% 
    rename(iso_ctry1 = iso_ctry.x, iso_ctry2 = iso_ctry.y, iso_ctry3 = iso_ctry)
}

df_list <- list(df1, df2)

(df1_new <- map(df_list, join_iso))  

【问题讨论】:

    标签: r tidyverse purrr


    【解决方案1】:

    你可以使用:

    library(tidyverse)
    
    join_iso <- function(df){
      df %>% 
        pivot_longer(-id) %>% 
        left_join(iso, by = c("value" = "ctry")) %>% 
        pivot_wider(id, names_from = name, values_from = c(value, iso_ctry), names_glue = "{name}_{.value}")
    }
    
    df_list <- list(df1, df2)
    
    map(df_list, join_iso)
    #> [[1]]
    #> # A tibble: 3 x 7
    #>      id ctry1_value ctry2_value ctry3_value ctry1_iso_ctry ctry2_iso_ctry
    #>   <int> <chr>       <chr>       <chr>       <chr>          <chr>         
    #> 1     1 us          ve          co          840            862           
    #> 2     2 es          pa          co          724            591           
    #> 3     3 fr          us          es          250            840           
    #> # ... with 1 more variable: ctry3_iso_ctry <chr>
    #> 
    #> [[2]]
    #> # A tibble: 3 x 7
    #>      id ctry1_value ctry2_value ctry3_value ctry1_iso_ctry ctry2_iso_ctry
    #>   <int> <chr>       <chr>       <chr>       <chr>          <chr>         
    #> 1     1 ve          es          pa          862            724           
    #> 2     2 ve          pa          co          862            591           
    #> 3     3 us          us          es          840            840           
    #> # ... with 1 more variable: ctry3_iso_ctry <chr>
    

    reprex package (v0.3.0) 于 2021-01-26 创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-03
      • 2018-08-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-05
      • 2016-04-28
      • 2021-02-14
      • 1970-01-01
      相关资源
      最近更新 更多