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

判断字符串中任职年份区间是否连续的R语言实现问题

问题排查与修正方案

原代码核心问题

  • 未处理重叠/包含的任期:直接对排序后的原始任期做相邻比较,会出现被包含的任期(如2001-2003、2007-2007都包含在2000-2009中)被误判为不连续的情况。
  • 连续性判断逻辑偏差:仅通过相邻任期的start与前一任期modified_end的比较,无法覆盖“大任期包含小任期”的场景。

修正后的代码实现

library(tidyverse)

all_terms <- "2012 to 2024, 2007 to 2007, 2001 to 2003, 2000 to 2009, 2010 to 2011"
# 测试不连续案例:all_terms <- "1989 to 2008, 2020 to 2024"

# 1. 解析任期字符串,转换为数据框
terms_list <- str_split(all_terms, ",\\s*")[[1]]
years_df <- map_dfr(terms_list, function(term) {
  years <- str_extract_all(term, "\\d{4}")[[1]] %>% as.numeric()
  data.frame(start = years[1], end = years[2])
})

# 2. 按起始年份排序
years_df <- years_df %>% arrange(start)

# 3. 合并重叠/连续的任期
merged_terms <- years_df %>%
  mutate(
    # 标记需要合并的组:当前start > 前一个end+1时,开启新组
    group = cumsum(c(TRUE, tail(start, -1) > head(end + 1, -1)))
  ) %>%
  group_by(group) %>%
  summarise(
    start = min(start),
    end = max(end)
  ) %>%
  ungroup()

# 4. 判断连续性:合并后只有1组则为连续
is_continuous <- nrow(merged_terms) == 1

# 输出结果
list(
  is_continuous = is_continuous,
  overall_start = min(years_df$start),
  overall_end = max(years_df$end),
  merged_terms = merged_terms
)

代码说明

  1. 任期解析:拆分字符串并提取年份,转换为数值型的起始/结束年份数据框。
  2. 排序:按起始年份排序,确保从早到晚处理任期。
  3. 合并任期:
    • 通过cumsum生成分组标记:当当前任期的起始年份 > 前一个任期的结束年份+1时,标记为新组。
    • 对每组取最小起始年份和最大结束年份,得到合并后的连续任期块。
  4. 连续性判断:如果合并后只有1个任期块,说明所有原始任期要么重叠、要么连续,符合规则要求。

测试验证

  • 示例输入"2012 to 2024, 2007 to 2007, 2001 to 2003, 2000 to 2009, 2010 to 2011":合并后得到1组(2000-2024),返回is_continuous = TRUE。
  • 测试不连续案例"1989 to 2008, 2020 to 2024":合并后得到2组,返回is_continuous = FALSE。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 08:37:40