簡體   English   中英

以靈活的條件加入/合並兩個數據幀

[英]join / merge two data frames with flexible condition

我想我的問題可能不清楚,所以我試着澄清一下。 假設我有兩個要合並的數據框。 兩個數據框中的每一行都是唯一的公司。 兩個數據框還包含具有這些公司唯一標識符的特定列“id_1”和“id_2”。 我希望他們使用“id_1”和“id_2”加入\合並(數據幀)。 最小可重現示例 id 如下

x <- structure(list(company = c("Apple", "Amazon", "BMW", "Audi"), 
                    id_1 = c("789879978", NA_character_, "12312312", NA_character_),
                    id_2 = c("32132131", "987978987", NA_character_, NA_character_)),
               .Names = c("company", "id_1", "id_2"), row.names = c(1:4), class = "data.frame")


y <- structure(list(id_1 = c("789879978111", "987654000", "12312312", "111123231"),
                    id_2 = c("32132131", "987978987", "098099808908", "9999999991"),
                    region = c("USA", "USA", "EU", "EU")),
               .Names = c("id_1", "id_2", "region"), row.names = c(1:4), class = "data.frame")

所需的 output

structure(list(company = c("Apple", "Amazon", "BMW", "Audi"), 
               id_1 = c("789879978", NA_character_, "12312312", NA_character_),
               id_2 = c("32132131", "987978987", NA_character_, NA_character_),
               region = c("USA", "USA", "EU", NA_character_)),
        .Names = c("company", "id_1", "id_2", "region"), row.names = c(1:4), class = "data.frame")

正如您可能看到的,“x”數據框中的 Apple“id_1”與“y”數據框中的不同,因此我需要使用“id_2”來合並這些行。 亞馬遜也一樣,而寶馬的“id_2”在兩個數據幀中都是NA ,所以我不能使用“id_2”,所以我需要使用“id_1”。 假設由於某種原因我無法更改/修復它。 所以我需要同時使用“id_1”和“id_2”來合並數據幀。 問題是,如果我將兩列都指定為 merge() 和/或 left_join() 中的鍵,它將不起作用,因為它需要兩個指定列的值的完美匹配。 在我的情況下,我需要使用“id_1”(如果可以匹配)或“id_2”(如果我不能使用“id_1”進行合並)的組合。

我的問題是如何使用靈活的條件合並兩個數據框,即如果足以合並則使用“id_1”和/或如果我不能在“id_1”內合並則使用“id_2”

您可以嘗試這種方法:


library(tidyr)
library(dplyr)

x %>% 
  pivot_longer(-company) %>% 
  left_join(pivot_longer(y, - region)) %>% 
  pivot_wider(names_from = name, values_from = value) %>% 
  group_by(company) %>% 
  fill(!company, .direction = "downup") %>% 
  distinct()
#> Joining, by = c("name", "value")
#> # A tibble: 4 x 4
#> # Groups:   company [4]
#>   company region id_1      id_2     
#>   <chr>   <chr>  <chr>     <chr>    
#> 1 Apple   USA    789879978 32132131 
#> 2 Amazon  USA    <NA>      987978987
#> 3 BMW     EU     12312312  <NA>     
#> 4 Audi    <NA>   <NA>      <NA>

代表 package (v2.0.1) 於 2021 年 12 月 13 日創建

left_join(x, y[-2], by = "id_1") %>% 
  left_join(y[-1], by = "id_2") %>% 
  mutate(region = coalesce(region.x, region.y)) %>% 
  select(-c(region.x, region.y))

  company      id_1      id_2 region
1   Apple 789879978  32132131    USA
2  Amazon      <NA> 987978987    USA
3     BMW  12312312      <NA>     EU
4    Audi      <NA>      <NA>   <NA>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM