使用dplyr的mutate_at()结合as.Date()转日期列报错求助
解决dplyr中mutate_at转换日期列的报错问题
我来帮你搞定这个问题,你遇到的错误根源是没有正确给as.Date()传递参数。直接写as.Date("%m/%d/%Y")相当于只传入了格式字符串,却没把要转换的列值(也就是函数的输入数据)传给as.Date()的第一个参数x,所以R没法识别要处理的日期字符串,自然就报错了。
正确的dplyr解决方案
方法1:用mutate_at()(兼容旧版dplyr)
需要用公式语法或者匿名函数,把列值传递给as.Date():
library(dplyr) df = data.frame(date_1 = "7/5/2014", date_2 = "7/22/2011") # 推荐的公式语法写法 df %>% mutate_at(.vars = c("date_1", "date_2"), .funs = ~as.Date(., format = "%m/%d/%Y")) # 匿名函数写法 df %>% mutate_at(.vars = c("date_1", "date_2"), .funs = function(x) as.Date(x, format = "%m/%d/%Y"))
方法2:用mutate(across())(新版dplyr首选)
mutate_at()目前已经是软弃用状态,新版dplyr更推荐用across()函数,写法更简洁统一:
# 指定列名转换 df %>% mutate(across(c("date_1", "date_2"), ~as.Date(., format = "%m/%d/%Y"))) # 如果列名有统一前缀(比如都是date_开头),可以用选择器更高效 df %>% mutate(across(starts_with("date_"), ~as.Date(., format = "%m/%d/%Y")))
其他可选方法
base R 处理方式
要是你不想用dplyr,也可以用base R的lapply()批量处理:
df[c("date_1", "date_2")] <- lapply(df[c("date_1", "date_2")], as.Date, format = "%m/%d/%Y")
用lubridate包简化操作
lubridate是专门处理日期时间的工具包,它的mdy()函数能自动识别月/日/年格式,不用手动写format参数:
library(lubridate) df %>% mutate(across(c("date_1", "date_2"), mdy))
这样就能顺利把字符型日期转换成标准的Date类型了。
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

