[R] Counter in a For Loop - Efficiency Issue

Petr Savicky savicky at praha1.ff.cuni.cz
Wed Feb 2 11:29:50 CET 2011


On Wed, Feb 02, 2011 at 09:35:28AM +0200, Leendert Punt wrote:
> I have a 32000 x 14 matrix (M) where entry (x, y) corresponds to
> person x at a discrete time y. I then have a matrix (M2) of 60000 x 2
> where each entry is a an event by a person that is in the above 32000
> and at a time that is in the range of the discrete time points above.
> I want to populate the another matrix (M3) such that (x, y) is the
> number of events of person x between times y-1 and y. This is simple
> to code, (I just put the discrete time points and the 32000 people in
> their own vectors, V1 and V2):
> 
> 
> for (i in 1:32000){
> for (j in 1:60000){
> 
> for (k in 2:14){
> 
> if (M2[1, j] == V2[i]   &   M2[2, j]  > V1[k-1]   &  M2[2, j] <= V1[k])
> M3[i, k] = M3[i, k]+1
> 
> }}}

Consider the following approach, which uses M2, V1 and V2 as
used in the code above.

  V1 <- c(0, 10, 20, 30, 40)
  V2 <- 1:3 # list of persons in the required order
  M2 <- rbind(
  c(1, 2, 1, 1, 3, 1, 3, 1),
  c(11, 21, 21, 21, 11, 21, 11, 31))

  person <- factor(M2[1, ], levels=V2)
  interval <- cut(M2[2, ], breaks=V1)
  M3 <- table(person, interval)

  M2

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    2    1    1    3    1    3    1
[2,]   11   21   21   21   11   21   11   31

  M3

        interval
  person (0,10] (10,20] (20,30] (30,40]
       1      0       1       3       1
       2      0       0       1       0
       3      0       2       0       0

Does this approach work for your data?

Petr Savicky.



More information about the R-help mailing list