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
相关产品推荐
相关产品推荐

