首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dplyr join最大匹配值,如果不可能完全匹配

Dplyr join最大匹配值,如果不可能完全匹配
EN

Stack Overflow用户
提问于 2018-01-10 18:35:50
回答 1查看 869关注 0票数 0

我正在尝试连接dplyr中的两个表。有时可以在列年份上匹配exact,但在某些情况下匹配的年份不可用。那样的话,我想最多加入一年。

代码语言:javascript
复制
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,但我无法对一列执行fuzzyjoin,而对另一列执行exact-join:

代码语言:javascript
复制
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变量的精确匹配上连接非匹配案例的最有效方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-10 21:04:47

我将在id和year上使用左连接,然后进行筛选以获得最适合year的匹配

代码语言:javascript
复制
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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48185418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档