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

使用dplyr::across批量拆分数据框日期列为年月日列的实现及报错解决

错误原因
  • 原始数据中dates开头的列是字符类型,未转换为标准日期格式,lubridate的日期提取函数无法直接处理字符串,因此触发格式转换报错
  • across函数的多函数调用格式错误,对同一列执行多个转换操作时,需要将所有函数放到list()中包裹,不能直接逗号分隔多个函数
正确实现方案

你可以通过.names参数自定义新生成列的命名规则,{.col}指代被遍历的原列名,{.fn}指代当前调用的函数名,示例代码如下:

library(tidyverse)
library(lubridate)

df <- tibble(dates1 = c("2020-08-03", "2020-08-03"),
             dates2 = c("2020-08-05", "2020-08-05"))

# 分步实现(可读性更高)
df_result <- df %>%
  # 先将所有日期字符串列转为标准日期格式
  mutate(across(contains("dates"), ymd)) %>%
  # 对所有日期列批量提取年月日,自动生成新列
  mutate(across(contains("dates"),
                list(day = day, month = month, year = year),
                .names = "{.col}_{.fn}"))

运行后会自动新增6个拆分列,命名格式为原列名_属性,例如dates1_day、dates1_month、dates2_year等。

如果希望一步完成转换和拆分,可以用匿名函数写法:

# 一步实现
df_result <- df %>%
  mutate(across(contains("dates"),
                list(day = ~day(ymd(.x)),
                     month = ~month(ymd(.x)),
                     year = ~year(ymd(.x))),
                .names = "{.col}_{.fn}"))

内容的提问来源于stack exchange,提问作者Forge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:54:04