【发布时间】:2015-04-01 00:40:23
【问题描述】:
我有一个数百万行的 data.table,其中一列是日期列。我想为该列中的所有日期添加 12 个月并创建一个新列。所以我使用 dplyr 和 lubridate 包,例如
library(dplyr)
library(lubridate)
new_data <- data %>% mutate(date12m = date %m+% months(12))
这很有效,但是对于大型数据集来说非常慢。我错过了什么吗?如何加快速度?对于这么简单的任务,我一般不希望 R 运行超过 10 分钟
编辑:
我注意到我的解决方案已经比使用 as.yearmon 更有效。感谢 Beauvel 上校的解决方案
a <- data.frame(date = rep(today(),1000000))
func = function(u) {
d = as.Date(as.yearmon(u)+1, frac=1)
if(day(u)>day(d)) return(d)
day(d) = day(u)
d
}
pt <- proc.time()
a <- a %>% mutate(date12m = func(date))
data.table::timetaken(pt)
pt <- proc.time()
a <- a %>% mutate(date12m = date %m+% 12)
data.table::timetaken(pt)
【问题讨论】:
-
您能提供一小部分数据吗?
-
希望答案有所帮助,您需要在应用我的函数之前将所需的列转换为日期。
-
我同意这应该更快,但考虑到日期以 1970 年 1 月 1 日以来的秒数存储,这并不是一项简单的任务