amaik
amaik

Reputation: 162

Circumvent aggregation in for-loop R

I want to find the first index k of an array, where the aggregate until that k is bigger than an given cutoff. This looks like follows in the code:

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

I was told there is a way to rewrite this without the for loop, I was also told the which statement would be helpful. I'm new to R and couldn't find the way. Any thoughts on this?

Upvotes: 0

Views: 43

Answers (2)

amonk
amonk

Reputation: 1795

You can use the following:

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

Upvotes: 0

Ivan Chernyshov
Ivan Chernyshov

Reputation: 263

First we find array of partial sums:

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

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

Next we find the indices of all the elements of partial_sums array which are bigger then cutoff:

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

[1] 6

Please note, that indices could be empty.

Upvotes: 1

Related Questions