R语言整数转日期格式函数报错:无法将'.'转为Date类
首先,咱们来拆解你遇到的两个核心问题:函数写法的逻辑错误,以及integer64类型的特殊处理方式。
1. 函数中的管道使用错误
你写的函数里用了df %>% base::as.Date(...),这里的管道会把df作为第一个参数传给as.Date(),但as.Date()的第一个参数需要的是待转换的日期向量,而不是整个数据框。这就是为什么你会收到do not know how to convert '.' to class “Date”的报错——.代表管道传进来的df,as.Date不知道怎么把数据框转成日期类型。
另外,你的函数调用方式也不对:函数定义是date_format(df, col),需要传入数据框和列名(比如date_format(df, column_character)),但你直接传了df$column_character这种向量,enquo(col)会把这个向量表达式当成列名处理,逻辑上就乱了。
2. integer64类型的特殊转换
integer64类型来自bit64包,直接用基础包的as.character()转换可能会出问题,需要用bit64::as.character.integer64()来正确解析它的数值。
修正后的函数
结合以上两点,我们可以调整函数的写法,同时兼容character和integer64类型的列:
library(dplyr) library(bit64) # 处理integer64类型需要这个包 date_format <- function(df, col) { col_sym <- ensym(col) # 用ensym更适合处理传入的列名 df %>% mutate(!!col_sym := case_when( # 判断列类型,分别处理 class(!!col_sym) == "character" ~ as.Date(!!col_sym, format = "%Y%m%d%H%M"), class(!!col_sym) == "integer64" ~ as.Date(as.character.integer64(!!col_sym), format = "%Y%m%d%H%M"), TRUE ~ NA_Date_ # 其他类型返回NA )) }
正确调用方式
现在你可以这样调用函数,传入数据框和列名(不需要加$):
# 处理character类型列 df <- date_format(df, column_character) # 处理integer64类型列 df <- date_format(df, column_integer64)
为什么单独运行代码可行,封装后不行?
你单独运行的代码是直接对向量操作:
df$column_integer64 <- as.Date(as.character(c(df$column_integer64)), format = '%Y%m%d%H%M')
这里df$column_integer64是一个向量,as.character()虽然对integer64的转换可能有隐患,但碰巧能工作;而封装后的函数错误地把整个数据框传给了as.Date(),同时调用方式也不符合函数定义的参数要求,所以就报错了。
内容的提问来源于stack exchange,提问作者user13267770

