Data.table为现有列赋值

时间:2012-12-06 16:28:20

标签: r data.table

我在data.table对象中执行一个看似简单的赋值。

library(RODBC)
library(data.table)
library(ffbase)
library(plyr)
library(doBy)
library(reshape2)

ST_a = Sys.Date()-7
ST = paste("'",as.character(format(ST_a,"%d.%m.%Y")),"'",sep="")
rd_a = Sys.Date()- 41
rd = paste("'",as.character(format(rd_a,"%d.%m.%Y")),"'",sep="")

ch<-odbcConnect("db",uid="user",pwd="psw")

chunks <- c(seq.Date(from=rd_a, to=ST_a, by = 20),ST_a)

started.at <- proc.time()
Sys.sleep(1)

memory.limit(size=4095)

for (i in 1:(length(chunks)-1)){

start <- paste("'",as.character(format(chunks[i],"%d.%m.%Y")),"'",sep="")
end <- paste("'",as.character(format(chunks[i+1],"%d.%m.%Y")),"'",sep="")

query <- paste("Select * from DATA_LOCAL_V 
        where id='EHPFCMO' and timestamp>",rd," and reference_date>=",start," and reference_date<",end,sep="") 

EHPFC.ck <- data.table(sqlQuery(ch,query,stringsAsFactors=FALSE))

EHPFC.ck[,TIMESTAMP:=TIMESTAMP-60^2]
EHPFC.ck[, pod:=7]
EHPFC.ck[as.POSIXlt(EHPFC.ck$TIMESTAMP)$hour %in% c(20:23), pod:=23]
EHPFC.ck[as.POSIXlt(EHPFC.ck$TIMESTAMP)$hour %in% c(8:19), pod:=19]
EHPFC.ck[,day:=as.Date(trunc(TIMESTAMP))]
EHPFC.ck[,TIMESTAMP:=NULL]
EHPFC.ck <- EHPFC.ck[,mean(VALUE),by=list(ID,REFERENCE_DATE,day,pod)]
setnames(EHPFC.ck,"V1","price")

EHPFC.ck <- as.ffdf(EHPFC.ck)

if (i==1){
EHPFC <- EHPFC.ck
} else {
EHPFC <- ffdfappend(EHPFC,EHPFC.ck[,])
}
rm(EHPFC.ck)
gc()

}

EHPFC <- data.table(EHPFC[,])
EHPFC <- orderBy(~day+pod+REFERENCE_DATE, data=EHPFC)
a <- c(0,log(EHPFC[-1,price]/EHPFC[-nrow(EHPFC),price]))
EHPFC <- EHPFC[,RoR:=a]

通过这样做我得到以下错误消息:

error in `[.data.table`(EHPFC, , `:=`(RoR, a)) : 
  At an earlier point, this data.table has been copied by R. Avoid key<-, names<- and attr<- which in R currently (and oddly) all copy the whole data.table. Use set* syntax instead to avoid copying: setkey(), setnames() and setattr(). If this message doesn't help, please ask on datatable-help.

对象EHPFC如下所示:

EHPFC
           ID REFERENCE_DATE        day pod    price RoR
 [1,] EHPFCMO     2012-10-27 2012-10-27   7 35.34625   0
 [2,] EHPFCMO     2012-10-28 2012-10-27   7 35.34625   0
 [3,] EHPFCMO     2012-10-29 2012-10-27   7 35.34625   0
 [4,] EHPFCMO     2012-10-30 2012-10-27   7 35.34625   0
 [5,] EHPFCMO     2012-10-31 2012-10-27   7 35.34625   0

我有点困惑为什么会这样。

有什么想法吗?提前谢谢。

0 个答案:

没有答案