组合 mutate、cross 和 as_date('yyyymmdd') 会导致所有 NA

问题描述 投票:0回答:1

我正在尝试组合 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>

有人可以告诉我这里出了什么问题以及如何获得所需的结果吗?

r date tidyverse lubridate across
1个回答
0
投票

当您使用

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
© www.soinside.com 2019 - 2024. All rights reserved.