You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于最近后续年份合并匹配名称与州的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 11:43:10