R - wektorowe warunkowe zastąpienie
Hi Próbuję manipulować listą liczb i chciałbym to zrobić bez pętli for, używając szybkiej operacji rodzimej w R. Pseudokod dla manipulacji to:
Domyślnie suma początkowa wynosi 100 (dla każdego bloku w zerach)
Od pierwszego zera do następnego zera, moment, w którym łączna suma spada o więcej niż 2%, zastępuje wszystkie kolejne liczby zerem.
Wykonaj do tej pory wszystkie bloki liczb w zerach
Łączne sumy są resetowane do 100 za każdym razem
Na przykład, jeśli następujące dane były moimi danymi:
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);
Wyniki byłyby następujące:
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
Obecnie mam implementację z pętlą for, ale ponieważ mój wektor jest naprawdę długi, wydajność jest straszna.
Z góry dziękuję.
Oto działający przykładowy kod:
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)