如果不可能精确匹配,则在最大匹配值上Dplyr join

如果不可能精确匹配,则在最大匹配值上Dplyr join,r,join,dplyr,fuzzyjoin,R,Join,Dplyr,Fuzzyjoin,我正在尝试连接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,

我正在尝试连接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

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

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
left_join(left,Right,by=“id”,后缀=c(“,“_r”))%>%
变异(增量=年份)%>%
过滤器(增量>=0)%>%
分组依据(id,年份)%>%
切片(哪个.min(增量))%>%
选择(-delta)
#一个tibble:3x4
#组:id,年份[3]
身份证年份新
2010年1月1日真实
2010年2月2日真实
3 2012年3月2011年真实

可能会有更有效的解决方案,但这对中等大小的数据集很有效。

在这种情况下,请详细说明,我希望在最长年份加入?@Sotos,在id==3的情况下,不进行匹配,因此我希望将左边的行与右边表上具有最长年份值的行进行匹配。我编辑了问题中的示例,因此右表中有两个id==3的值。我想将左id==3连接到右行id==3&year==2011@RichardTelford,一个完整的连接会给我6行,我应该做什么过滤操作?
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