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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:37:29