【问题标题】:Munging dates in R [closed]R中的修改日期[关闭]
【发布时间】:2018-06-11 14:01:00
【问题描述】:

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

我认为解决此问题的策略是:

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

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

【问题讨论】:

  • 第三种选择是将日期作为整数使用,除非您需要将它们作为特定数据修改步骤的日期类,例如当您需要 by = "month" 时。这可能是 (1) 和 (2) 之间的一种折衷方案,它不那么乏味,更不容易出错,因为您不假设自动投射,但足够灵活,可以完成您的杂务。
  • 也许How to iterate over list of Dates without coercion to numeric in R? 和其中的链接会有所帮助。还有好人ifelse "trap"...
  • 谢谢 Henrik -- 这很有帮助。 PS。为什么这个问题被标记为离题?我可以为一些不保留日期的操作添加代码,但我怀疑这会改善问题。

标签: r date datetime data-munging


【解决方案1】:

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

【讨论】:

  • 我同意缺乏对日期的支持是一个错误,但我不明白 data.table 的相关性。我可以在data.table 之外进行这些操作并得到正确的答案。
  • 恕我直言,您似乎误解了问题所在。参见例如关于preserving Date type 的这个问题(上面已经链接)。 data.table 没有这样的问题,这就是我觉得它很方便的原因。另外,data.table 解决方案往往很快。但是有很多不同的方法可以给猫剥皮,如果你有一种更喜欢的方法,一定要坚持下去。
  • 但是你自己的例子失败了:cat(dt[1, "date"], "\n") 并没有比cat(dates[1], "\n") 做得更好。
  • 使用format() 进行显示。 Date 类属性被删除的情况相同。您仍然误解最初的问题是关于处理管道,即一次处理多个日期,而您在这里的抱怨与此无关。所以请停止它。
  • 我同意,您应该使用format() 进行显示,因为cat() 丢失了类。但我仍然不明白data.table 有什么帮助:我也需要使用format() 来显示其中一个元素。我不是在抱怨,我是在要求澄清。但是,如果它让您太不高兴,请随意忽略该请求。
【解决方案2】:

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

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

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

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

【讨论】:

  • sapply 上很好!除了集合操作,unlistifelse 浮现在脑海中。我当然可以解决这些问题,所以确实“修复并不难”,但是必须记住在一个程序的任何地方应用这些修复是非常烦人的。对我来说,这是 R 中类型的明显弱点之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-09
  • 2013-04-06
  • 1970-01-01
  • 2016-05-05
  • 2018-03-18
相关资源
最近更新 更多