判断字符串中任职年份区间是否连续的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 )
代码说明
- 任期解析:拆分字符串并提取年份,转换为数值型的起始/结束年份数据框。
- 排序:按起始年份排序,确保从早到晚处理任期。
- 合并任期:
- 通过
cumsum生成分组标记:当当前任期的起始年份 > 前一个任期的结束年份+1时,标记为新组。 - 对每组取最小起始年份和最大结束年份,得到合并后的连续任期块。
- 通过
- 连续性判断:如果合并后只有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
相关产品推荐
相关产品推荐

