Dplyr 加入最大匹配值,如果不可能完全匹配
Dplyr join on maximum matching value, if no exact match is possible
我正在尝试在 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 语法在 year 变量的最小距离和 id 变量的精确匹配上连接不匹配案例的最有效方法是什么?
我会在 id 和年份上使用左连接,然后过滤以获得年份的最佳匹配
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
可能有更有效的解决方案,但这适用于中等规模的数据集。
我正在尝试在 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 语法在 year 变量的最小距离和 id 变量的精确匹配上连接不匹配案例的最有效方法是什么?
我会在 id 和年份上使用左连接,然后过滤以获得年份的最佳匹配
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
可能有更有效的解决方案,但这适用于中等规模的数据集。