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

如何在R语言中按日期条件将单列数据拆分为多列?

在R中按日期标记拆分单列数据为多列

问题描述

需要把单列的待办事项历史数据按日期拆分到多列,每个日期对应的任务组单独成列。日期格式固定为月份前三个字母(首字母大写)+ 空格 + 日期数字,还要避免把像"Decide"这类含月份缩写的非日期文本误判成日期。

输入数据示例

# 原始单列数据
df <- data.frame(
  X1 = c("Nov 1", "task2", "task3", "Oct 31", "task2", "task3", "task4", "task5", "Oct 29", "task2")
)

期望输出

# 拆分后的多列数据
       X1       X2       X3
1   Nov 1   Oct 31   Oct 29
2   task2    task2    task2
3   task3    task3       NA
4      NA    task4       NA
5      NA    task5       NA

解决方案

步骤说明

  1. 精准识别日期行:用正则表达式匹配标准日期格式,排除非日期文本;
  2. 给任务组分ID:每遇到一个日期,就开启一个新的任务组,给同组的日期和任务分配相同ID;
  3. 标记组内行序:给每个组里的行按顺序编号,方便后续转宽格式时对齐;
  4. 转成宽格式:把长数据转成多列形式,缺失的位置自动补NA。

代码实现

library(tidyverse)

# 原始数据
df <- data.frame(
  X1 = c("Nov 1", "task2", "task3", "Oct 31", "task2", "task3", "task4", "task5", "Oct 29", "task2")
)

# 数据处理流程
result <- df %>%
  # 识别日期行,生成连续的组ID
  mutate(group_id = cumsum(str_detect(X1, "^[A-Z][a-z]{2} \\d+$"))) %>%
  # 给每个组内的行编序号
  group_by(group_id) %>%
  mutate(row_num = row_number()) %>%
  ungroup() %>%
  # 转宽格式,列名按X1、X2...命名
  pivot_wider(
    names_from = group_id,
    values_from = X1,
    names_prefix = "X"
  ) %>%
  # 移除行号列
  select(-row_num)

# 查看最终结果
print(result)

关键细节解释

  • 正则表达式^[A-Z][a-z]{2} \\d+$:严格匹配「首字母大写、后两个小写的3位月份缩写+空格+数字」的格式,彻底避免"Decide"这类文本被误判;
  • cumsum(str_detect(...)):通过累计求和生成组ID,每碰到一个日期就自动开启新组;
  • pivot_wider:自动按组内的行号对齐所有列,缺失的位置自动填充NA,完全符合期望的输出样式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 21:43:31