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

R语言:提取列中最早日期并转为日期格式添加为新列

从换行分隔列提取最早日期并保留日期格式的解决方法

一、修复原sapply代码,直接得到日期格式结果

你当前代码返回时间戳的原因是:min()处理lubridate::parse_date_time生成的POSIXct日期对象时,会自动将其转换为数值型的时间戳(从1970-01-01开始的秒数)。可以通过以下两种方式修复:

方法1:将时间戳转回POSIXct格式

在sapply结果外层包裹as.POSIXct(),指定原点和时区:

library(dplyr)
library(lubridate)

data.frame(x = c("2023-1-2\n2034-02-10", "2023-1-2\n2001-10-30")) %>% 
    mutate(earliest_date = as.POSIXct(
        sapply(strsplit(x, "\\n"), 
               function(x) min(parse_date_time(x, orders = c("mdy", "ymd")), na.rm = TRUE)),
        origin = "1970-01-01", tz = "UTC" # 时区可根据需求调整
    ))

方法2:使用purrr::map_dttm保留日期类型

推荐用purrr的map_dttm函数,它会直接返回POSIXct类型的向量,避免数值转换:

library(dplyr)
library(lubridate)
library(purrr)

data.frame(x = c("2023-1-2\n2034-02-10", "2023-1-2\n2001-10-30")) %>% 
    mutate(earliest_date = map_dttm(strsplit(x, "\\n"), 
                                    ~ min(parse_date_time(.x, orders = c("mdy", "ymd")), na.rm = TRUE)))

运行后结果会是标准日期格式:

x earliest_date
1 2023-1-2\n2034-02-10    2023-01-02
2 2023-1-2\n2001-10-30    2001-10-30

二、将lapply结果添加为数据框新列

lapply返回的是列表类型,每个元素对应一个日期对象,只需用unlist()将其转换为向量,即可直接赋值给数据框的新列:

方式1:基础R赋值

library(lubridate)

# 创建数据框
df <- data.frame(x = c("2023-1-2\n2034-02-10", "2023-1-2\n2001-10-30"))

# 用lapply生成日期列表
date_list <- lapply(strsplit(df$x, "\\n"), 
                    function(x) min(parse_date_time(x, orders = c("mdy", "ymd")), na.rm = TRUE))

# 添加为新列
df$earliest_date <- unlist(date_list)

方式2:结合dplyr::mutate

library(dplyr)
library(lubridate)

df <- data.frame(x = c("2023-1-2\n2034-02-10", "2023-1-2\n2001-10-30")) %>% 
    mutate(earliest_date = unlist(lapply(strsplit(x, "\\n"), 
                                         function(x) min(parse_date_time(x, orders = c("mdy", "ymd")), na.rm = TRUE))))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 19:03:14