R: merge based on multiple conditions (with non-equal criteria)

后端 未结 5 789
陌清茗
陌清茗 2021-01-01 05:26

I would like to merge 2 data frames based on multiple conditions.

DF1 <- data.frame(\"col1\" = rep(c(\"A\",\"B\"), 18),
                  \"col2\" = rep(c         


        
5条回答
  •  刺人心
    刺人心 (楼主)
    2021-01-01 05:47

    Using my package safejoin which wraps fuzzyjoin functions, you can do :

    # devtools::install_github("moodymudskipper/safejoin")
    library(safejoin)
    debugonce(safe_left_join)
    
    safe_left_join(DF1, DF2,  ~
                      X("col1") == Y("col1") & 
                      X("col2") == Y("col2") & 
                      X("value") >= Y("min") &
                      X("value") <= Y("max"),
                   conflict = ~.x) %>% 
      head(15)
    #    col1 col2 value col4 data min max
    # 1     A    C    90   NA   NA  NA  NA
    # 2     B    D    20   NA   NA  NA  NA
    # 3     A    E     8   NA   NA  NA  NA
    # 4     B    C    99   NA   NA  NA  NA
    # 5     A    D    42   NA   NA  NA  NA
    # 6     B    E    37   NA   NA  NA  NA
    # 7     A    C    47   NA    1  40  50
    # 8     B    D    61   NA   NA  NA  NA
    # 9     A    E    55   NA   NA  NA  NA
    # 10    B    C    11   NA   NA  NA  NA
    # 11    A    D    81   NA   NA  NA  NA
    # 12    B    E    48   NA   NA  NA  NA
    # 13    A    C    77   NA   NA  NA  NA
    # 14    B    D    58   NA   NA  NA  NA
    # 15    A    E     3   NA   NA  NA  NA
    

    The conflict argument here tells the function to return only the conflicted columns from the lhs (col1 and col2).

提交回复
热议问题