Ich versuche mit loops.table für mehrere Zeit mit mehreren Schleifen umzugehen und wurde frustriert. Mit sql ist es ziemlich intuitiv, aber mit R habe ich einige Probleme.Mehrere Schleifen mit data.table in R
Zum Beispiel würde ich eine txt-Datei (wie ich Hunderte von Dateien, jeweils etwa 1 GB haben), die Berechnungen (Summe Preis und Quant, wenn Zeit> my.time und für einige ausgewählte Isins, gruppiert von my.time, isin und price), schreibe die Ergebnisse in eine CSV-Datei, entferne die ursprüngliche TXT-Datei aus dem R-Speicher; Wiederholen Sie diese Berechnungen dann nacheinander für alle TXT-Dateien und hängen Sie die Ausgabe-CSV-Datei an.
Fangen wir mit den Beispieldaten (ziemlich klein, nur zwei identische Dateien für Illustration) beginnen:
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")
Dann versuche ich diese 2 einfache Schleifen:
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)
}}
Zweite edit: Die Schleife mit j fing schließlich an, für mich zu arbeiten (wegen des fettgedruckten Teils). Vielleicht wäre es möglich, ohne for-Schleifen zu arbeiten und die gleichen Ergebnisse zu erhalten?
Vielen Dank für Ihre Hilfe!
an welchem Punkt funktioniert es nicht für Sie? Hast du Warnung und Fehler gelesen, die du in deinem Code bekommst? – jangorecki
Ja, zuerst bekomme ich diese Meldung: 'Fehler in' [.data.table' (dt, was (isin% in% my.isin & time> meine Zeit),: Die Elemente in der 'von' oder "keyby" -Liste ist length (86401,1,86401). Jede muss dieselbe Länge wie Zeilen in x oder Anzahl der Zeilen haben, die von i (0) zurückgegeben werden. " – Linas
Ok, also beschweren Sie sich über Ihre Verwendung von' j' in "by". Vielleicht musst du zurückgehen und überlegen, was du damit machen wolltest ...? (Der meiste Code ist sehr verschieden von dem, was ich normalerweise sehe, also verstehe ich es nicht wirklich.) – Frank