2014-07-14 5 views
1

J'essaie d'évaluer si un prix, le prix (k), dans une rangée donnée, (k), est égal à celui ci-dessus, le prix (k-1). Si c'est le cas, je veux additionner le volume du précédent et le prix en question, volume (k) + volume (k + 1), puis enlever la ligne avec le prix en double, ligne k.Efficace (répéter) en boucle

J'ai la boucle de répétition suivante que j'applique à un jeu de données volumineux qui cherche à supprimer des valeurs répétées. La boucle est très lente et je me demandais s'il y avait des façons de l'accélérer. Malheureusement, je suis relativement nouveau à R et j'ai du mal à trouver la meilleure façon d'y parvenir.

Y a-t-il aussi un moyen d'observer l'itération de la boucle? c'est-à-dire l'afficher dans l'espace de travail à chaque itération?

données Exemple:

 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

Are u vous que le code est pour les « valeurs répétées », pouvez-vous nous donner un exemple fictif sur ce qui est attendu est sortie? – Aashu

+0

Oui. Toutes mes excuses, l'instruction if initiale manquait dans ma requête d'origine. – user2832896

+0

avez-vous vu sa sortie après une boucle? Les moyennes Prix cadre de données après la répétition terminée? – Aashu

Répondre

2

Il semble que vous voulez quelque chose comme ceci:

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

Je pense que votre code va en boucle infinie à cause de l'index d'augmentation. K=k+1 et Break est toujours dans la condition, j'espère que vous voulez que ce

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]),] 

} 

Je l'espère aider, merci.

+0

Nous vous remercions de votre aide! – user2832896