2016-01-27 78 views
1

我有一个数据文件,目前有超过170万行,每周增长。我试图用R来创建一个脚本,根据我们随时间推移的性能(产品时代在这方面扮演重要角色)总结质量,以及我们在现场遇到的问题。最初我想过使用dplyrread.csv()而不是使用data.tablefread()。速度差异是驱使我朝着data.table发展的原因,但我在语法上挣扎。使用R data.table包修改日期列

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

我试过以下使用zoo包 - 我期待一个日期,但我得到了原始的6位代码回来。我的笔记本电脑运行了一段时间。

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

我搜索谷歌和data.table小抄,我想我一定是接近这个错误 - 设定()似乎是这样做的正确方法。然后,我试过如下:

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]. 

我以为我= .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 
+0

您是否尝试过转换的日期“格式”到具有构建函数的标准R日期格式,因此您可以使用as.Date()或任何其他您想要的方式进行转换。 –

回答

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 

因此报告的错误可能是链接到一些不正确的数据在数据集中

+0

这不适用于OP的数据。他们提到有些日期还有一天,有些只有一个月和一年。您的方法将忽略日期部分并将月份的最后一天分配给所有值。 –

+0

感谢您指出这@PierreLafortune:我编辑包括YYYYMMDD以及YYYYMM – HubertL

+0

非常感谢你们伙计们! @HubertL,你是对的......我已经“清理”了数据以消除错误数字的日期,但是我没有清理数据来消除像199900(1999年的第00个月)或760510(第10个月我需要退后一步并继续整理我的数据,谢谢 – NetGary0430