【发布时间】:2017-05-03 17:38:18
【问题描述】:
我尝试用 data.table 处理多个循环已经有一段时间了,结果很沮丧。使用 sql 它非常直观,但是使用 RI 我遇到了一些问题。
例如,我想读取一个 txt 文件(因为我有数百个文件,每个文件大约 1 GB),进行计算(总价格和数量,当 time>my.time 和某些选定的 isin 时,分组通过 my.time、isin 和 price),将结果写入某个 csv 文件,从 R 内存中删除原始 txt 文件;然后对所有 txt 文件逐一重做这些计算,并附加输出 csv 文件。
让我们从示例数据开始(非常小,只是两个相同的文件用于说明):
time<-format(seq.POSIXt(as.POSIXct(Sys.Date()), as.POSIXct(Sys.Date()+1), by = "1 sec"),"%H:%M:%S")
n<-length(time)
isin<-paste("US",1:n,sep="")
price<-rnorm(n,101,1)
quant<-rnorm(n,5,1)
dt<-data.table(time,isin,price,quant)
write.table(dt,"raw.txt",append = FALSE,sep = ",",col.names = TRUE, row.names = FALSE)
write.table(dt,"raw2.txt",append = FALSE,sep = ",",col.names = TRUE, row.names = FALSE)
my.files <- list.files(pattern = "raw*.txt")
my.time<-format(seq.POSIXt(as.POSIXct(Sys.Date()), as.POSIXct(Sys.Date()+1), by = "5 min"),"%H:%M:%S")
my.isin<-c("US100","US150","US225","US250","US1050")
然后我尝试这两个简单的循环:
for (i in my.files){
for (j in my.time){
dt<-fread(i)
write.table(dt[which(isin %in% my.isin & time>j),
.(sprice=sum(price),squant=sum(quant),**time.my=j**), by = .(isin,price)],
"output.csv",append = TRUE,sep = ",",col.names = TRUE)
rm(dt)
}}
第二次编辑: j 的循环终于开始为我工作(由于粗体部分)。也许没有 for 循环也可以工作并获得相同的结果?
非常感谢您的帮助!
【问题讨论】:
-
什么时候它不适合你?您是否阅读了代码中出现的警告和错误信息?
-
是的,起初我收到这条消息:
Error in[.data.table(dt, which(isin %in% my.isin & time > my.time), : The items in the 'by' or 'keyby' list are length (86401,1,86401). Each must be same length as rows in x or number of rows returned by i (0). -
好的,所以它抱怨您在
by中使用j。也许你需要回去想想你在那里试图用它做什么..? (你的大部分代码和我平时看到的很不一样,所以我不太明白。) -
我想每 5 分钟建立一次累积交易统计:我试图找到一些选定 Isin 的所有价格和数量的总和,其中实际交易时间高于我定义的时间间隔(每 5 分钟) .结果应按 Isin、唯一价格(因为可能有相同的价格)和定义的时间(每 5 分钟一次)分组。
-
@Linas 而不是额外的循环(每 5 分钟),您可以尝试在时间列上使用非 equi 连接。也不要对像“价格”这样的双精度数据类型(浮点数)进行分组,在进行分组时将其格式化为定义的精度。
标签: r loops for-loop data.table dt