我有一个数字向量如下
aa <- c(1022011, 2022011, 13022011, 23022011) (this vector is just a sample, it is very long)
值的编写方式是第一个值是日,然后是月,然后是年。
我现在正在做的是
as.Date(as.character(aa), %d%m%Y")
但是,
在单位数字日数的情况下引起问题(返回NA)。 (即1022011,2022011)。
所以基本上
as.Date("1022011", "%d%m%Y") does not work
但
as.Date("01022011", "%d%m%Y") (pasting '0' ahead of the number) works.
我想避免粘贴&#39; 0&#39;在这种情况下。有没有其他(直接)替代方法可以一次将数值转换为日期?
答案 0 :(得分:5)
可以使用sub
进行重新排列,在这种情况下,没有格式的普通as.Date
有效:
x <- c(1022011, 11022011) # test data
pat <- "^(..?)(..)(....)$"
as.Date(sub(pat, "\\3-\\2-\\1", x))
,并提供:
[1] "2011-02-01" "2011-02-11"
答案 1 :(得分:3)
根据您的平台,您可以使用sprintf
以便在开头添加零。似乎Mac对此没问题,但是在与OP的讨论中没有Windows 7。
aa <- c(1022011, 2022011, 13022011, 23022011)
as.Date(sprintf("%08s", aa), format = "%d%m%Y")
[1] "2011-02-01" "2011-02-02" "2011-02-13" "2011-02-23"
<强>更新强>
@CathyG提到sprintf("%08i",aa)
适用于Windows 7。
答案 2 :(得分:3)
您可以在dmy
中使用lubridate
:
library(lubridate)
aa <- c(1022011, 2022011, 13022011, 23022011)
> dmy(aa)
[1] "2011-02-01 UTC" "2011-02-02 UTC" "2011-02-13 UTC" "2011-02-23 UTC"
如果您不想将时区包装在as.Date
:
> as.Date(dmy(aa))
[1] "2011-02-01" "2011-02-02" "2011-02-13" "2011-02-23"
谢谢@Ben Bolker,
> as.Date(mdy(aa))
[1] "2011-01-02" "2011-02-02" "2012-01-02" "2011-01-02"
答案 3 :(得分:1)
我知道你不想添加&#34; 0&#34;但是,在基础R中,这仍然有效:
as.Date(sapply(aa,function(x){ifelse(nchar(x)==8,x,paste("0",x,sep=""))}),format = "%d%m%Y")