如何基于最近后续年份合并匹配名称与州的R数据框?
你的代码报错是因为合并后根本不存在year.y和year.x这两个列。df1里的年份列叫year,df2里的叫year_election,列名不同,left_join不会自动给它们加.x/.y后缀,所以filter的时候找不到这两个对象。
要实现「按name+state精确匹配,给每个year找最近的后续year_election」这个需求,给你两种可行的方案:
方案一:用dplyr+purrr分组匹配
先按name和state分组,对每组里的每个year,筛选同组df2中满足year_election >= year的最小值:
library(dplyr) library(purrr) df3 <- df1 %>% group_by(name, state) %>% # 对每个year,找到对应组里符合条件的最小year_election mutate(next_year = map_dbl(year, ~ { target_rows <- df2$year_election[df2$name == cur_group()$name & df2$state == cur_group()$state] min(target_rows[target_rows >= .x]) })) %>% ungroup()
方案二:用fuzzyjoin模糊连接后筛选
先用模糊连接匹配name+state相等且year <= year_election的所有组合,再给每个原始行保留最小的year_election:
library(fuzzyjoin) library(dplyr) df3 <- df1 %>% fuzzy_left_join( df2, by = c("name" = "name", "state" = "state", "year" = "year_election"), match_fun = list(`==`, `==`, `<=`) # 匹配规则:name和state相等,且year <= year_election ) %>% group_by(name, state, year) %>% filter(year_election == min(year_election)) %>% # 取最近的后续年份 ungroup() %>% select(name, state, year, next_year = year_election) # 重命名并保留需要的列
运行任意一种方案,得到的结果都和你想要的df3完全一致。
内容的提问来源于stack exchange,提问作者hy9fesh
相关产品推荐
相关产品推荐

