使用R data.table包修改日期列

时间:2016-01-27 20:43:10

标签: r date data.table

我有一个数据文件,目前有超过170万行,每周增长。我正在尝试使用R来创建一个脚本,该脚本根据我们的表现随着时间的推移总结质量(产品年龄对此很重要)以及我们在该领域的问题趋势。最初我考虑使用dplyrread.csv()与使用data.tablefread()。速度差异正在推动我走向data.table,但我正在努力解决语法问题。

数据最初使用日期代码存储在CSV文件中,例如201501(2015年1月)或20150127(2015年1月27日)。我正在尝试将这些日期转换为我可以计算产品年龄的标准日期(制造日期至服务电话)。我想将201601更改为2016-01-31。

我使用zoo包尝试了以下内容 - 我预计会有一个日期,但我得到了原来的6位数代码。我的笔记本电脑上运行了很长时间。

DT <- DT[, Mfrdate:=as.Date(as.yearmon(as.character(MfrDate), "%Y%m"), frac = 1)]

我搜索了Google和data.table备忘单,并认为我必须接近这个错误 - set()似乎是正确的方法。然后我尝试了以下内容:

set(DT,i = .N , j = "MfrDate", value = as.Date(as.yearmon(as.character(DT[,2]), "%Y%m"), frac = 1)

我收到以下错误:

Error in set(DT, i = .N, j = "MfrDate", value = as.Date(as.yearmon(as.character(DT[,  : 
  i[1] is 1821628 which is out of range [1,nrow=1761094].

我认为i = .N是不正确的,所以,我把它拿出来并错误地运行了命令,然后将其改为其他东西。它在没有警告或错误的情况下运行,但它将我的所有列都更改为NA。我错过了什么。

非常感谢帮助。

> sessionInfo()
R version 3.2.3 (2015-12-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] RevoUtilsMath_3.2.3

loaded via a namespace (and not attached):
[1] tools_3.2.3

1 个答案:

答案 0 :(得分:1)

您的第一个语法在此示例中按预期工作:

require(data.table)
require(zoo)
require(stringr)
DT <- data.table(r=c(1,2,3), MfrDate=c(200101, 20010228, 200103))
DT <- DT[str_length(MfrDate)==6, Mfrdate:=as.Date(as.yearmon(as.character(MfrDate), "%Y%m"), frac = 1)]
DT <- DT[str_length(MfrDate)==8, Mfrdate:=as.Date(as.yearmon(as.character(MfrDate), "%Y%m%d"), frac = 1)]
head(DT)

   r  MfrDate    Mfrdate
1: 1   200101 2001-01-31
2: 2 20010228 2001-02-28
3: 3   200103 2001-03-31

因此,报告的错误可能与数据集中的某些不正确数据相关联