如何使用purrr批量将多个tibble的指定列转换为日期类型?
解决tibble列表与对应日期列的批量类型转换问题
没错,你完全说对了!这里必须用purrr::map2才能解决你的问题,咱们先聊聊你之前代码出错的原因:
你用purrr::map遍历tibble列表时,每次都把完整的list_dates传给mutate_at——这就相当于让df1去处理它根本不存在的date_b列,让df2去处理它没有的date_a列,自然会抛出“未知列”的错误。
要实现每个tibble对应唯一日期列的精准转换,map2是最合适的工具,它能让两个长度相同的列表做一一对应的操作。下面是两种可行的解决方案:
方案1:基于mutate_at的写法(兼容旧版dplyr)
library(tibble) library(purrr) library(lubridate) library(dplyr) df1 <- tribble(~date_a, ~value_a, "2017-1-3", 10, "2018-2-7", 13, "2018-5-7", 35) df2 <- tribble(~date_b, ~value_b, "2014-1-7", 10, "2018-4-9", 6, "2018-5-8", 18) list_dfs <- list(df1, df2) list_dates <- c("date_a", "date_b") # 用map2实现一一对应的转换 converted_dfs <- list_dfs %>% map2(list_dates, ~mutate_at(.x, vars(.y), ymd))
方案2:基于across的现代写法(推荐)
因为mutate_at已经属于软弃用的函数,dplyr现在更推荐用across来实现批量列操作,写法如下:
converted_dfs <- list_dfs %>% map2(list_dates, ~mutate(.x, across(all_of(.y), ymd)))
验证转换结果
你可以用str()函数查看转换后的数据结构,确认日期列已经变成Date类型:
map(converted_dfs, str)
输出会显示:
tibble [3 × 2] (S3: tbl_df/tbl/data.frame) $ date_a : Date[1:3], format: "2017-01-03" "2018-02-07" "2018-05-07" $ value_a: num [1:3] 10 13 35 tibble [3 × 2] (S3: tbl_df/tbl/data.frame) $ date_b : Date[1:3], format: "2014-01-07" "2018-04-09" "2018-05-08" $ value_b: num [1:3] 10 6 18
这样就完美实现了每个tibble对应日期列的精准转换啦!
内容的提问来源于stack exchange,提问作者Peter MacPherson
相关产品推荐
相关产品推荐

