如何在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
解决方案
步骤说明
- 精准识别日期行:用正则表达式匹配标准日期格式,排除非日期文本;
- 给任务组分ID:每遇到一个日期,就开启一个新的任务组,给同组的日期和任务分配相同ID;
- 标记组内行序:给每个组里的行按顺序编号,方便后续转宽格式时对齐;
- 转成宽格式:把长数据转成多列形式,缺失的位置自动补
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
相关产品推荐
相关产品推荐

