R - vektorisiertes bedingtes Ersetzen

Hallo, ich versuche, eine Liste von Zahlen zu manipulieren, und ich möchte dies ohne eine for-Schleife tun, wobei ich eine schnelle native Operation in R verwende. Der Pseudocode für die Manipulation lautet:

Standardmäßig beträgt die Startsumme 100 (für jeden Block innerhalb von Nullen)

Ab der ersten Null bis zur nächsten Null werden alle nachfolgenden Zahlen durch Null ersetzt, sobald die kumulierte Summe um mehr als 2% abfällt.

Machen Sie so weit alle Zahlenblöcke innerhalb von Nullen

Die kumulierten Summen werden jedes Mal auf 100 zurückgesetzt

Zum Beispiel wenn folgende meine Daten waren:

d <- c(0,0,0,1,3,4,5,-1,2,3,-5,8,0,0,-2,-3,3,5,0,0,0,-1,-1,-1,-1);

Ergebnisse wären:

0 0 0 1 3 4 5 -1 2 3 -5 0 0 0 -2 -3 0 0 0 0 0 -1 -1 -1 0

Derzeit habe ich eine Implementierung mit einer for-Schleife, aber da mein Vektor sehr lang ist, ist die Leistung schrecklich.

Danke im Voraus.

Hier ist ein laufender Beispielcode:

d <- c(0,0,0,1,3,4,5,-1,2,3,-5,8,0,0,-2,-3,3,5,0,0,0,-1,-1,-1,-1);
ans <- d;
running_total <- 100;
count <- 1;
max <- 100;
toggle <- FALSE;
processing <- FALSE;

for(i in d){
  if( i != 0 ){  
       processing <- TRUE; 
       if(toggle == TRUE){
          ans[count] = 0;  
       }
       else{
         running_total = running_total + i;

          if( running_total > max ){ max = running_total;}
          else if ( 0.98*max > running_total){
              toggle <- TRUE;  
          }
      }
   }

   if( i == 0 && processing == TRUE )
   { 
       running_total = 100; 
       max = 100;
       toggle <- FALSE;
   }
   count <- count + 1;
}
cat(ans)

Antworten auf die Frage(1)

Ihre Antwort auf die Frage