在R语言中将多列字符型数据转换为POSIXct格式的问题
问题:批量转换字符型日期列为POSIXct格式
我有多个数据框,导入后其中的多个日期时间列初始为字符型变量,希望将它们转换为POSIXct格式(其他日期时间格式也可接受)。
以下是其中一个数据框的示例:
visit<-as.data.frame(structure(list(EncounterID=structure(c(1, 2, 3, 4, 5, 6)), ICU_FIRST=structure(c("03-08-2018 12:00:00", "03-17-2018 05:32:00", "02-11-2018 09:15:00", "04-01-2019 15:10:00", "04-30-2018 06:05:00", "04-18-2018 18:45:00")), ICU_LAST=structure(c("03-10-2018 10:27:00", "03-17-2018 15:45:00", "02-27-2018 09:30:00", "04-05-2019 18:49:00", "05-29-2018 06:48:00", "04-19-2018 19:33:00")))))
尝试的代码及错误
第一次尝试结合mutate(across())与as.POSIXct:
visit<-visit%>% mutate(across(as.POSIXct(starts_with("ICU"), format="%m-%d-%Y %H:%M")))
收到错误:
Problem while evaluating as.POSIXct(starts_with(x), format = "%m-%d-%Y %H:%M").
第二次尝试省略格式参数:
visit<-visit%>% mutate(across(starts_with("ICU"), as.POSIXct))
收到提示:
character string is not in a standard unambiguous format
我理解这是因为日期字符串的格式不是R默认识别的标准格式。
最终目标是把这段转换逻辑整合到全局函数中,目前先让它在该数据框上生效。
解决方法
问题核心是across()的语法使用错误,以及未指定匹配日期字符串的格式。across()的第一个参数是列选择器,第二个参数是要应用的函数,带参数的函数需要用匿名函数语法传递。
单数据框转换代码
library(dplyr) visit <- visit %>% mutate(across(starts_with("ICU"), ~ as.POSIXct(., format = "%m-%d-%Y %H:%M:%S")))
代码解释
starts_with("ICU")作为across()的第一个参数,正确筛选所有以ICU开头的列;~ as.POSIXct(., format = ...)是匿名函数写法,.代表当前处理的列,传递给as.POSIXct();- 指定
format = "%m-%d-%Y %H:%M:%S"匹配你的日期字符串格式(月-日-年 时:分:秒),让R能正确解析字符型日期。
全局通用函数
如果要批量处理多个数据框,可以封装成通用函数:
convert_date_cols <- function(df, prefix = "ICU", date_format = "%m-%d-%Y %H:%M:%S") { df %>% mutate(across(starts_with(prefix), ~ as.POSIXct(., format = date_format))) } # 使用示例 visit <- convert_date_cols(visit) # 处理其他数据框时可自定义前缀和格式 # other_df <- convert_date_cols(other_df, prefix = "ADMIT", date_format = "%Y/%m/%d %H:%M")
内容的提问来源于stack exchange,提问作者EtoiledeMoyenOrient
相关产品推荐
相关产品推荐

