如何在R中将相邻年周向量分组拼接为带连字符的合并字符串?
R实现年周相邻序列合并的惯用方法
核心思路是拆分年周字段后识别连续周段,再按段格式化拼接,两种常用实现方式如下:
基于tidyverse的实现(更易读)
library(tidyverse) # 示例输入 s <- c('2020 WK 01', '2021 WK 41', '2021 WK 42', '2021 WK 43', '2021 WK 45') title <- as_tibble(s) %>% # 拆分年、周标识、周数,自动转为数值类型 separate(value, into = c("year", "wk_label", "week"), convert = TRUE) %>% group_by(year) %>% # 给同一年份内的连续周分配相同分组ID mutate(grp = cumsum(c(1, diff(week) != 1))) %>% group_by(year, grp) %>% summarise( # 单周直接输出,多周合并为起止格式 week_str = if_else( n() == 1, paste(year, wk_label, sprintf("%02d", week)), paste(year, wk_label, sprintf("%02d", min(week)), "-", sprintf("%02d", max(week))) ), .groups = "drop" ) %>% pull(week_str) %>% # 所有段用逗号拼接 paste(collapse = ", ") # 验证输出 cat(title) # 2020 WK 01, 2021 WK 41 - 43, 2021 WK 45
基于base R的实现(无需依赖第三方包)
# 示例输入 s <- c('2020 WK 01', '2021 WK 41', '2021 WK 42', '2021 WK 43', '2021 WK 45') # 正则提取年份和周数的数值 parts <- strcapture("(\\d+) WK (\\d+)", s, list(year = integer(), week = integer())) # 按年份分组处理连续周 res <- lapply(split(parts, parts$year), function(df) { df <- df[order(df$week), ] # 分配连续段ID df$grp <- cumsum(c(1, diff(df$week) != 1)) sapply(split(df, df$grp), function(sub) { if (nrow(sub) == 1) { sprintf("%d WK %02d", sub$year, sub$week) } else { sprintf("%d WK %02d - %02d", sub$year[1], min(sub$week), max(sub$week)) } }) }) title <- paste(unname(unlist(res)), collapse = ", ") cat(title)
内容的提问来源于stack exchange,提问作者nluigi
相关产品推荐
相关产品推荐

