我有一个字符串列出了一个人的任期,例如.

all_terms <- "2012 to 2024, 2007 to 2007, 2001 to 2003, 2000 to 2009, 2010 to 2011"

我想知道这个人是否连续任职,这意味着:

  1. 一个任期的结束年份和另一个任期的开始年份可以相差1,即2011年结束的任期和2012年开始的新任期将被视为连续的.

  2. 在其他任期内或跨越其他任期的任期不应影响连续性,即上文2001年至2003年的任期属于2000年至2009年,不影响连续性.同样,2008年至2013年的任期不会影响连续性.

因此,上述例子将被认为是连续的,但这个-"1989年到2008年,2020年到2024年"将不是.

我想出了这个代码,但它不工作:

all_terms <- "2012 to 2024, 2007 to 2007, 2001 to 2003, 2000 to 2009, 2010 to 2011"

# Process terms to extract years and create a data frame
terms_list <- str_split(all_terms, ",\\s*")[[1]]
years <- map(terms_list, ~str_extract_all(.x, "\\d{4}")[[1]])
years_df <- map_df(years, ~data.frame(start = as.numeric(.x[1]), end = as.numeric(.x[2])))

# Sort years by start date
years_df <- years_df %>% arrange(start)

# Adjust end year by adding one for continuity check
years_df$modified_end <- years_df$end + 1

# Check for continuity
is_continuous <- all(c(TRUE, tail(years_df$start, -1) <= head(years_df$modified_end, -1)))

# Results
list(
  is_continuous = is_continuous,
  start_years = min(years_df$start),
  end_years = max(years_df$end)
)

推荐答案

我们可以使用cummaxcumsum.我创建了一个函数来计算非连续项的数量.关于这些函数的更多细节,请参考我之前的答案:Collapse and merge overlapping time intervals.*

one_term <- "2012 to 2024, 2007 to 2007, 2001 to 2003, 2000 to 2009, 2010 to 2011"
two_term <- "2013 to 2024, 2007 to 2007, 2001 to 2003, 2000 to 2009, 2010 to 2011"
four_term <- "2013 to 2024, 2007 to 2007, 2001 to 2003, 2000 to 2005, 2010 to 2011"

library(dplyr)

term_counter <- function(string_dat) {
as.data.frame(
  do.call(rbind,
          strsplit(strsplit(string_dat,
                            ", ")[[1]],
                   " to "))) %>% 
  mutate(across(everything(), as.numeric)) %>% 
  arrange(V1, V2) %>% 
  mutate(terms = 1 + c(0, cumsum(lead(V1 - 1) >
                              cummax(V2))[-n()])) %>% 
  pull(terms) %>% max()
}
  
term_counter(one_term)
#> [1] 1
term_counter(two_term)
#> [1] 2
term_counter(four_term)
#> [1] 4

创建于2024-04-11,reprex v2.0.2

* 这不是这个问题的重复.

R相关问答推荐

如何在ggplot 2 geom_segment图表中将UTC转换为EET?

ggplot geom_smooth()用于线性回归虚拟变量-没有回归线

根据选中三个复选框中的一个或两个来调整绘图

提取具有连续零值的行,如果它们前面有R中的有效值

在R中无法读入具有Readxl和lApply的数据集

用关联字符串替换列名的元素

R中的时间序列(Ts)函数计数不正确

根据现有列的名称和字符串的存在进行变异以创建多个新列

根据1个变量绘制 colored颜色 发散的 map ,由另一个变量绘制饱和度,ggplot2不工作

过滤名称以特定字符串开头的文件

使用geom_iles在一个切片中包含多个值

在r中整理图例和堆叠图的问题

如何在条形图中的x和填充变量中包含多个响应变量?

ArrangeGrob()和类似的替代方法不接受Grob列表.在Grid.Draw,返回:glist中的错误(...):仅允许在glist";中使用Grobs;

需要一个函数来在第一行创建一个新变量,然后用新变量替换一个不同的变量(对于多行)

在ggplot2图表中通过端点连接点

在分面的ggplot2条形图中对条形图进行排序,并省略每组未使用的系数级别

GgHighlight找不到它创建的列:`Highlight..1`->;`Highlight.....`

使用点图调整离散轴比例

如何在R曲线图弹出窗口中更改r和theta标签