[R] Speeding up a loop

wwreith reith_william at bah.com
Sat Jul 21 14:26:38 CEST 2012


next for loop question.

I need a loop that removes a row from a matrix if it is worse in positions
1,2,3,4 than another row in the matrix. right now my matrix is 503028x26.

Rule to define worse position1 is smaller, position2 is smaller, position3
is higher, and position4 is smaller

Example: 

row1: 1, 10, 3, 3
row2: 3, 7, 5, 2


row2 is not worse than row1 since it is "better" in position 1, eventhough
it is worse in all other positions.

row3: 2,5,7,1
row3 however is worse than row2 and should be removed from the matrix.

Any ideas? Should I break this into pieces or do it all at once? Is there
something faster than a loop? My current loops takes well over 24 hours to
run.


m<-matrix(0,1,24)
for(i in 1:n)
{
 a<-matrix(x[i,1:4],1,4)
j=1
      nn<-nrow(m)
      counter<-0
      while(j<=nn)
      {
        if(a[1]>m[j,1] && a[2]>m[j,2] && a[3]>m[j,4] && a[4]<m[j,4])
        {
          m<-m[-j,]
          nn<-length(m[,1])
          counter<-1
        } else j<-j+1
      }
      if(counter==1)
      {
        b<-cbind(a,x)
         m<-rbind(m,b)
      }
      if(counter==0)
      {
        if(a[1]>min(m[,1]) || a[3]>min(m[,3]) || a[4]>min(m[,4]) ||
a[5]<max(m[,5]))
        {
          b<-cbind(a,x)
           m<-rbind(m,b)
        }
     }
}



--
View this message in context: http://r.789695.n4.nabble.com/Speeding-up-a-loop-tp4637201p4637305.html
Sent from the R help mailing list archive at Nabble.com.



More information about the R-help mailing list