[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