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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:48:01