나는 꽤 많은 시간 동안 data.table을 가진 다중 루프를 다루려고 노력하고 좌절감을 느꼈다. SQL을 사용하면 매우 직관적 인 부분이 있지만 R을 사용하면 몇 가지 문제가 발생합니다.R에있는 data.table을 가진 다중 루프
예를 들어, 하나의 txt 파일을 자유롭게하고 싶습니다. (파일이 수백 개 정도되고, 각 1GB 정도입니다.) 계산을하십시오 (합계 가격과 퀀트, 시간이 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 루프없이 작업하여 동일한 결과를 얻을 수있을 것입니다.
도움 주셔서 대단히 감사드립니다.
어느 지점에서 작동하지 않습니까? 코드에서 경고 및 오류를 읽었습니까? – jangorecki
예, 처음에는 다음 메시지가 표시됩니다. '[.data.table' (dt, % my.isin 및 time> my.time의 isin %) 오류 : 'by '또는 'keyby'리스트는 length (86401,1,86401)이고, 각각은 x의 행이나 i (0)가 반환 한 행의 길이와 같아야합니다. ' – Linas
자,'j '의 사용에 대해 불평하고 있습니다. 'by' 아마도 당신은 돌아가서 거기서 무엇을하려고했는지 생각할 필요가있을 것입니다. (당신의 코드의 대부분은 내가 보통 보는 것과는 아주 다르기 때문에 실제로 얻지는 않습니다.) – Frank