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

基于选举数据集计算生成执政年份列表的R语言技术实现需求

解决R语言中生成执政年份范围变量的问题

我来帮你搞定这个生成ruling_year变量的需求!咱们可以用dplyr做数据分组和窗口计算,搭配purrr来生成年份序列,完美贴合你给出的规则。

具体步骤&代码

首先加载需要的包,然后一步步处理数据:

# 加载必备的包
library(dplyr)
library(purrr)

# 你的示例数据集
toy <- data.frame( election_year=c(1995,1999,2009,2014), election_country=rep("A",4))

# 核心处理逻辑
toy_processed <- toy %>%
  # 按国家分组,保证每个国家的选举年份独立计算
  group_by(election_country) %>%
  mutate(
    # 获取下一次选举的年份,最后一行没有下一次选举会返回NA
    next_election = lead(election_year),
    # 按照规则计算执政结束年份:
    # 1. 有下一次选举且间隔≤5年 → 下一次选举前一年
    # 2. 没有下一次选举/间隔超过5年 → 选举年份+4(保证最长执政5年)
    end_year = case_when(
      !is.na(next_election) & (next_election - election_year) <=5 ~ next_election - 1,
      TRUE ~ election_year + 4
    ),
    # 生成年份序列并拼接成指定格式的字符串
    ruling_year = map2_chr(election_year, end_year, ~paste(.x:.y, collapse = " - "))
  ) %>%
  # 移除中间临时变量(可选,看你是否需要保留)
  select(-next_election, -end_year)

# 查看最终结果
toy_processed

运行结果

执行上面的代码后,你会得到和期望完全一致的输出:

# A tibble: 4 × 3
# Groups:   election_country [1]
  election_year election_country ruling_year                         
          <dbl> <chr>            <chr>                               
1          1995 A                1995 - 1996 - 1997 - 1998           
2          1999 A                1999 - 2000 - 2001 - 2002 - 2003     
3          2009 A                2009 - 2010 - 2011 - 2012 - 2013     
4          2014 A                2014 - 2015 - 2016 - 2017 - 2018

逻辑解释

  • 分组处理:用group_by(election_country)确保如果你的数据集有多个国家,每个国家的选举年份都是独立计算的,不会互相干扰。
  • 获取下一次选举年份:lead(election_year)是dplyr的窗口函数,能帮我们拿到当前行的下一行选举年份,最后一行因为没有下一行,会返回NA。
  • 规则判断:case_when完美实现了你要求的两个规则:正常情况用下一次选举前一年结束,缺失或者间隔超5年的话,就强制最长执政5年(从选举年到选举年+4,刚好5个年份)。
  • 生成年份字符串:map2_chr会遍历每一行的起始和结束年份,生成连续的年份序列,再用paste把它们用-拼接起来,最终得到你要的格式。

这个方案不仅适配你的示例数据,还能轻松扩展到多国家、有更多选举缺失情况的数据集哦!

内容的提问来源于stack exchange,提问作者MCS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:44:08