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)