我正在尝试组合 mutate、cross 和 as_date,包括 as_date 中的
format
参数。这将产生所有 NA
值,如下所示。
library(tidyverse)
library(tis)
holidays(2023) %>%
data.frame() %>%
set_names('holiday_date') %>%
rownames_to_column() %>%
pivot_wider(names_from = rowname,values_from = holiday_date) %>%
mutate(across(everything(), as.character)) %>%
mutate(across(everything(),
#as_date # WORKS
~as_date(.,format="yyyymmdd") # DOESN'T WORK
))
这会导致
# A tibble: 1 × 10
NewYears MLKing GWBirthday Memorial Juneteenth Independence Labor Columbus Thanksgiving
<date> <date> <date> <date> <date> <date> <date> <date> <date>
1 NA NA NA NA NA NA NA NA NA
# ℹ 1 more variable: Christmas <date>
如果我将注释掉的
as_date
行(标记为“WORKS
”)替换为~as_date
行(“DOESN'T WORK
”),我会得到预期的结果,但没有所需的格式:
# A tibble: 1 × 10
NewYears MLKing GWBirthday Memorial Juneteenth Independence Labor Columbus Thanksgiving
<date> <date> <date> <date> <date> <date> <date> <date> <date>
1 2023-01-02 2023-01-16 2023-02-20 2023-05-29 2023-06-19 2023-07-04 2023-09-04 2023-10-09 2023-11-23
# ℹ 1 more variable: Christmas <date>
有人可以告诉我这里出了什么问题以及如何获得所需的结果吗?
当您使用
pivot_wider()
然后应用 mutate(across(...))
时,列类型会转换为字符格式,因此使用 as_date
和格式参数进行日期转换会出现问题。
而是直接在
mutate(across(...))
之后使用 pivot_wider()
将列转换为字符,然后使用另一个 mutate(across(...))
将它们转换为日期。您可以指定自己想要的格式。
holidays(2023) %>%
data.frame() %>%
set_names('holiday_date') %>%
rownames_to_column() %>%
pivot_wider(names_from = rowname, values_from = holiday_date) %>%
mutate(across(everything(), as.character)) %>%
mutate(across(everything(), as_date)) %>% # Convert to dates without format
mutate(across(everything(),
~as_date(., format = "%Y-%m-%d"))) # Convert to dates with the desired format