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

在R中提取列中日期并补全缺失年份的tidyverse方案求助

解决方案

核心思路是先对提取到的日期字符串按斜杠数量区分格式,再根据给定的时间范围补全缺失的年份,最后统一转为日期格式,全程使用tidyverse向量化运算,适配大数据集处理需求:

library(tidyverse)

db <- data.frame(A1 = c("review 11/18", "begins 12/4/19", "3/5/20", NA, "deadline 09/5/19", "9/3")) 

result <- db %>%
  # 提取由数字和斜杠组成的日期片段
  mutate(A2_raw = str_extract(A1, "[0-9/]+")) %>%
  # 按格式补全年份后转标准日期
  mutate(A2 = case_when(
    # 带年份的格式(2个斜杠)直接按规则解析
    str_count(A2_raw, "/") == 2 ~ as.Date(A2_raw, "%m/%d/%y"),
    # 不带年份的格式(1个斜杠)根据月份补对应年份
    str_count(A2_raw, "/") == 1 ~ case_when(
      # 月份≥9属于2019年
      as.integer(str_extract(A2_raw, "^\\d+")) >= 9 ~ as.Date(paste0(A2_raw, "/19"), "%m/%d/%y"),
      # 月份<9属于2020年
      TRUE ~ as.Date(paste0(A2_raw, "/20"), "%m/%d/%y")
    )
  ))

运行后输出的A2列结果如下,无缺失值:

A1A2_rawA2
review 11/1811/182019-11-18
begins 12/4/1912/4/192019-12-04
3/5/203/5/202020-03-05
deadline 09/5/1909/5/192019-09-05
9/39/32019-09-03

关于as.Date格式的疑问解答

as.Date函数中指定的格式是输入解析规则,作用是告诉R传入的字符串每个位置对应的日期组件,不是输出显示格式。R内部会将日期统一存储为1970-01-01以来的天数数值,默认显示为YYYY-MM-DD格式。如果需要自定义显示样式,可以用format()函数将日期转为字符串,示例:format(A2, "%m/%d/%y")即可得到月/日/年格式的显示结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:15:08