2014-07-14 4 views
1

주어진 행 (k)의 가격 (가격) (k)가 위의 가격 (k-1)과 동일한 지 평가하려고합니다. 이전 볼륨과 해당 가격 (볼륨 (k) + 볼륨 (k + 1))에서 볼륨을 합한 다음 중복 가격 인 행 k를 제거하십시오.효율적인 (반복) 루핑

나는 반복 된 값을 삭제하려고하는 거대한 데이터 세트에 적용 할 다음 반복 루프를 가지고 있습니다.

k <- 1 
repeat{ 
if(Prices$Price[ k + 1 ] == Prices$Price[ k ]){ 
Prices$CumVolume[ k + 1 ] <- Prices$CumVolume[ k + 1 ] + Prices$CumVolume[ k ] 
Prices <- Prices[ -k , ] 
k <- k + 1 
if(k > nrow(Prices)) break 
} 
} 

루프가 매우 느리고 속도를 높이는 방법이 있는지 궁금합니다. 불행하게도 나는 R에 비교적 새롭고 이것에 관해가는 가장 좋은 길을 찾기가 어렵다.

루프가 현재 반복 중임을 관찰하는 방법이 있습니까? 즉, 작업이 반복 될 때마다 작업 영역에 표시됩니까?

예 데이터 :

 Date   Time  Price  CumVolume Ret MeanRet VolRet 
26 01-JAN-2009 21:30:01.783 96.660  537 0  0  0 
31 01-JAN-2009 21:30:58.041 96.650  78 0  0  0 
33 01-JAN-2009 21:34:09.589 96.640  60 0  0  0 
35 01-JAN-2009 21:34:10.879 96.640  40 0  0  0 
37 01-JAN-2009 21:35:55.001 96.635  50 0  0  0 
+0

는, U 코드가 "반복 값"에 대한 것을 확실합니까? – Aashu

+0

예. 원래의 쿼리에서 초기 if 문이 누락되었습니다. – user2832896

+0

루프 후에 출력을 보았습니까? 가격 데이터 프레임 반복을 마친 후 의미? – Aashu

답변

2

당신이 뭔가를 원하는 나타납니다 당신이 우리에게 출력도 예상되는 사항에 대한 몇 가지 더미 예를 들어 줄 수

DF <- read.table(text="  Date   Time  Price  CumVolume Ret MeanRet VolRet 
26 01-JAN-2009 21:30:01.783 96.660  537 0  0  0 
31 01-JAN-2009 21:30:58.041 96.650  78 0  0  0 
33 01-JAN-2009 21:34:09.589 96.640  60 0  0  0 
35 01-JAN-2009 21:34:10.879 96.640  40 0  0  0 
37 01-JAN-2009 21:35:55.001 96.635  50 0  0  0", header=TRUE) 

#create a run id 
DF$runs <- cumsum(c(TRUE, diff(DF$Price) != 0)) 
#sum per each price run 
DF$CCVolume <- with(DF, ave(CumVolume, runs, FUN=sum)) 
#remove duplicated prices 
DF[!duplicated(DF$Price), ] 
#   Date   Time Price CumVolume Ret MeanRet VolRet runs CCVolume 
#26 01-JAN-2009 21:30:01.783 96.660  537 0  0  0 1  537 
#31 01-JAN-2009 21:30:58.041 96.650  78 0  0  0 2  78 
#33 01-JAN-2009 21:34:09.589 96.640  60 0  0  0 3  100 
#37 01-JAN-2009 21:35:55.001 96.635  50 0  0  0 4  50 
1

나는 코드로 인해 사용자의 증가 지수의 무한 루프에 갈 생각합니다. K=k+1Break이 조건 내에서 항상, 당신이, 덕분에 내가 도움이 희망이

k=1 
z=unique(Prices$Price) 
for(i in 1:length(z)) 
{ 
    dupindex=which(z[i]==Prices$Price) 
    Prices$CumVolume[tail(dupindex,n=1)]=sum(Prices$CumVolume[dupindex]) 
    Prices=Prices[-(dupindex[1:length(dupindex)-1]),] 

} 

을 원하는 바랍니다.

+0

도움 주셔서 감사합니다. – user2832896