我尝试将几列转换为日期,如果它们遵循“自起源以来的天数”的格式(在这里,如果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>
如果提供了原始日期,为什么会出现错误?预先谢谢你。
答案 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>