首页 文章

如果不可能完全匹配,则Dplyr加入最大匹配值

提问于
浏览
0

我正在尝试在dplyr中加入两个表 . 有时可以在列年匹配完全匹配,但在某些情况下匹配的年份不可用 . 在那种情况下,我想加入最长的一年

Left <- tibble(id = c(1,2,3),
           year = c(2010,2010,2012))

Right <- tibble(id = c(1,1,2,3,3),
            year = c(2010,2011,2010,2010,2011),
            new = c(T,T,T,T,T))

Joined <- left_join(Left, Right, by = c("id", "year"))

# A tibble: 3 x 3
     id  year   new
  <dbl> <dbl> <lgl>
1     1  2010  TRUE
2     2  2010  TRUE
3     3  2012    NA

正如你所看到的,id 3不匹配,我尝试了一下fuzzyjoin包,但是我无法在一列上进行模糊连接,而在另一列上进行精确连接:

Fuzzy_joined <- fuzzyjoin::difference_left_join(Left, Right, by = c("id", "year"))
Fuzzy_joined
# A tibble: 9 x 5
   id.x year.x  id.y year.y   new
  <dbl>  <dbl> <dbl>  <dbl> <lgl>
1     1   2010     1   2010  TRUE
2     1   2010     1   2011  TRUE
3     1   2010     2   2010  TRUE
4     2   2010     1   2010  TRUE
5     2   2010     1   2011  TRUE
6     2   2010     2   2010  TRUE
7     2   2010     3   2010  TRUE
8     2   2010     3   2011  TRUE
9     3   2012     3   2011  TRUE

使用dplyr语法,在年变量的最小距离上加入非匹配情况以及id变量的精确匹配的最有效方法是什么?

1 回答

  • 1

    我会在id和year上使用左连接,然后过滤以获得年度最佳匹配

    left_join(Left, Right, by = "id", suffix  = c("", "_r")) %>% 
      mutate(delta = year - year_r) %>% 
      filter(delta >= 0) %>% 
      group_by(id, year) %>% 
      slice(which.min(delta)) %>% 
      select(-delta)
    
    # A tibble: 3 x 4
    # Groups:   id, year [3]
         id  year year_r   new
      <dbl> <dbl>  <dbl> <lgl>
    1     1  2010   2010  TRUE
    2     2  2010   2010  TRUE
    3     3  2012   2011  TRUE
    

    可能有更高效的解决方案,但这适用于中等大小的数据集 .

相关问题