mutate_at在多个元组中的日期

时间:2018-05-22 08:53:33

标签: r dplyr lubridate purrr

我有一个字节列表,以及我希望转换为日期类的列列表。

library(tibble)
library(purrr)
library(lubridate)

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")

尝试使用purrr:mapdplyr:mutate_atlubridate::ymd来有效地转换这些内容,但收到以下错误消息:

list_dfs %>% map(~mutate_at(.x, vars(list_dates), ymd))
Error: Strings must match column names. Unknown columns: date_b

This似乎相似,但我无法通过点击和列进行映射。

我是否需要使用purrr::map2做一些聪明的事情?

1 个答案:

答案 0 :(得分:4)

你是对的,你可以使用purrr::map2,其中第一个参数将是你的元组列表,第二个参数是列名列表

list_dfs <- list(df1, df2)
list_dates <- c("date_a", "date_b")

result <- map2(list_dfs, list_dates, ~ mutate_at(.x, .y, ymd))

result

# [[1]]
# # A tibble: 3 x 2
#   date_a     value_a
#   <date>       <dbl>
# 1 2017-01-03     10.
# 2 2018-02-07     13.
# 3 2018-05-07     35.

# [[2]]
# # A tibble: 3 x 2
#   date_b     value_b
#   <date>       <dbl>
# 1 2014-01-07     10.
# 2 2018-04-09      6.
# 3 2018-05-08     18.

for (i in seq_along(result)) {
    assign(paste0("df", i), result[[i]])
}