将数字列转换为日期并遇到:“必须提供as.Date.numeric(value)错误:'origin'”

时间:2020-09-21 19:49:37

标签: r dplyr

我尝试将几列转换为日期,如果它们遵循“自起源以来的天数”的格式(在这里,如果nchar(col)== 5)并遇到错误:

示例数据:

df <- data.frame(col1=c(44008, 440017, NA, 77), col2=c(43476, 43479, 77, NA))
> df
    col1  col2
1  44008 43476
2 440017 43479
3     NA    77
4     77    NA

尝试:

df %>%
mutate_at(vars(col1, col2), funs(as.numeric(as.character(.)))) %>%
  mutate_at(vars(col1, col2), 
            funs(case_when((nchar(.)==5)~(as.Date(., origin = "1899-12-30")),TRUE~.)) )

错误消息:

Error in as.Date.numeric(value) : 'origin' must be supplied

所需:

        col1       col2
1 2020-06-26 2019-01-11
2 3104-09-21 2019-01-14
3       <NA>         77
4         77       <NA>

如果提供了原始日期,为什么会出现错误?预先谢谢你。

1 个答案:

答案 0 :(得分:1)

如果目的是仅将字符数至少为5的那些元素转换为Date类,并保留其他元素不变。但是,在此过程中,我们不能拥有Date类,因为诸如77之类的数字可以是数字,也可以是字符串。在这里,我们用as.character

转换为字符串
library(dplyr) # v >= 1.0.0
df %>% 
   mutate(across(everything(),
    ~ case_when(nchar(.) >= 5 
           ~ as.character(as.Date(., origin = '1899-12-30')),
       TRUE ~ as.character(.))))
#     col1       col2
#1 2020-06-26 2019-01-11
#2 3104-09-21 2019-01-14
#3       <NA>         77
#4         77       <NA>