使用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
相关产品推荐
相关产品推荐

