2017-05-19 4 views
0

Ich möchte den ersten Index k eines Arrays finden, wo das Aggregat bis zu diesem k größer ist als eine gegebene Grenze. Das sieht aus wie im Code folgt:Umgehungsaggregation in for-Schleife R

k <- 0 
agg <- 0 
while (agg < cutoff) { 
    k <- k +1 
    agg <- sum(array[1:k]) 
} 

Mir wurde gesagt, es gibt eine Möglichkeit, dies für Schleife ohne die neu zu schreiben, war ich auch die gesagt, die Aussage wäre hilfreich. Ich bin neu in R und konnte den Weg nicht finden. Irgendwelche Gedanken dazu?

+0

Bitte beachten Sie, dass Sie auch einen Teil der Daten hinzufügen müssen – amonk

Antwort

1

Zuerst finden wir Reihe von Teilsummen:

x <- 1:10 
partial_sums <- Reduce('+', x, accumulate = T) 
partial_sums 

[1] 1 3 6 10 15 21 28 36 45 55

Weiter finden wir die Indizes aller Elemente des partial_sums Array, das dann Abschneide größer ist:

cutoff <- 17 
indices <- which(partial_sums > cutoff) 
indices[1] 

[1 ] 6

Bitte beachten Sie, dass indices leer sein kann.

0

können Sie die Verwendung folgende:

seed(123)#in order to have reproducible "random" numbers 
m1 <- matrix(sample(10),nrow = 5,ncol = 2)# create a matrix 

m1 
     [,1] [,2] 
    [1,] 7 5 
    [2,] 4 2 
    [3,] 9 8 
    [4,] 1 6 
    [5,] 3 10  

cutoff <- 5 #applying cutoff value 
apply(m1,2,function(x){x<cutoff})#checking each column using apply instead of loop 

OR:

which(m1 < cutoff) #results in the indices of m1 that comply to the condition <cutoff 

[1] 2 4 5 7

EDIT

cutoff<-30# a new cutoff 
v1<-unlist(lapply(seq_along(1:(nrow(m1)*ncol(m1))),function(x){sum(m1[1:x])}))#adding the values of each cell 
which(v1>=cutoff)[1]#find the 1st of occurrence 
+0

Nein, ich möchte überprüfen, ob das Aggregat bis zu einem Index größer als der Cutoff ist. – amaik

+0

könnten Sie die Ausgabe schreiben, die Sie sich vorstellen, die 'm1' gegeben? – amonk