不保留Date
类错误功能是 R 本身的人工制品,以及一些基本 R 函数是如何实现的。参见例如
R> dates <- Sys.Date() + 0:2
R> for (d in dates) cat(d, "\n")
17532
17533
17534
R>
本质上,当您执行某些向量操作时,S3 类属性会被删除:
R> as.vector(dates)
[1] 17532 17533 17534
R>
所以我的建议是选择一个你喜欢的好的容器类型并坚持使用它来进行操作。为此,我非常喜欢data.table 。一个简单的例子:
R> suppressMessages(library(data.table))
R> dt <- data.table(date=Sys.Date()+0:2, other=Sys.Date() + cumsum(runif(3)*100))
R> dt[, diff:=other-date][]
date other diff
1: 2018-01-01 2018-03-30 88.88445 days
2: 2018-01-02 2018-06-09 158.23913 days
3: 2018-01-03 2018-07-30 208.62187 days
R> dt[, month:=month(other)][]
date other diff month
1: 2018-01-01 2018-03-30 88.88445 days 3
2: 2018-01-02 2018-06-09 158.23913 days 6
3: 2018-01-03 2018-07-30 208.62187 days 7
R>
不仅Date
类型保持不变(正如返回difftime
对象的差异操作所证明的那样),而且您还可以在此处获得许多辅助函数(如month()
)。按日期分组也是很自然的。