我有一个R数据帧,其中包含日期序列。我想从现有的数据框创建一个包含一个月前日期的数据框。 例如,让x为初始数据帧
x = data.frame(dt = c("28/02/2000","29/02/2000","1/03/2000","02/03/2000"))
我所需的数据框y是
y = c("28/01/2000","29/01/2000","1/02/2000","02/02/2000")
列表非常大,所以我不想要循环。我创建了一个内联函数,当我给出个别日期时它可以正常工作。
datefun <- function(x) seq(as.Date(strptime(x,format = "%d/%m/%Y")), length =2, by = "-1 month")[2]
datefun("28/02/2000") gives "28/01/2000" as an output
但是当我在R中使用它时,它会给出随机数值。
apply(x,1,function(x) datefun(x))
此输出为
[1] 10984 10985 10988 10989
我不知道这些数字的生成地点,我错过了什么。
答案 0 :(得分:4)
您还可以使用lubridate
跳过您的功能:
require(lubridate)
format(dmy(x$dt) %m+% months(-1),"%d/%m/%Y")
答案 1 :(得分:3)
我相信R内部存储的日期是自UNIX纪元(1970年1月1日)以来的时间。您可以使用as.Date
以适当的来源轻松查看更新的日期作为可读字符串,例如< / p>
y <- apply(x,1,function(x) datefun(x))
as.Date(y, origin='1970-01-01')
[1] "2000-01-28" "2000-01-29" "2000-02-01" "2000-02-02"
这里的要点是你看到的数字输出可能误导你认为你的日期信息不知何故丢失了。相反,日期以数字格式存储,由您决定如何将该信息视为日期。
答案 2 :(得分:2)
您不应该使用apply
,因为结果将作为矩阵返回。 R中的矩阵不能存储类Date
的值。您必须使用lapply
。这将返回结果列表。这些结果可与Reduce
和c
结合使用,以创建Date
向量。
Reduce(c, lapply(x$dt, datefun))
# [1] "2000-01-28" "2000-01-29" "2000-02-01" "2000-02-02"