1

我正在研究数据中包含大量日期列的数据处理管道。许多 R 函数(例如,设置操作sapply等)不保留日期类,将日期转换为整数。

我看到的处理这个问题的策略是:

  1. 确保数据处理管道中的每个函数都接受并返回格式化为日期的日期。缺点:找出所有要粘贴的地方as.Date()通常很乏味。
  2. 在所有修改步骤中将日期作为整数生活,仅在最后将它们转换为日期。by = "month"这样做的缺点是,如果不首先转换为日期,则无法在中间修改步骤中进行日期操作(例如,使用 排序)。

我还缺少其他选择吗?有没有办法让 R 和日期玩得很好?澄清一下,我正在处理的数据不仅仅是一个时间序列:多个列包含日期。因此,据我所知,xts它的用处有限。

4

2 回答 2

2

sapply用一个你想要的函数替换调用可能并不难。例如,

sapply2 <- function(X, FUN, ...) {
  do.call(c, lapply(X, FUN, ...))
}

这不像 original 那样通用sapply,但是如果您在中使用的函数sapply(X, FUN)返回日期,它将保留它们。如果您想使用 的可选参数sapply,则需要更详细的内容。

我不知道您的“等”中有多少其他功能,但我猜它不是很多,而且大多数修复并不那么难。

于 2018-01-01T16:36:18.607 回答
2

不保留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())。按日期分组也是很自然的。

于 2018-01-01T16:52:04.533 回答