[R] counting run lengths

Dimitris Rizopoulos d.rizopoulos at erasmusmc.nl
Mon Oct 27 10:52:18 CET 2008


it's not totally clear to me what exactly do you need in this case, but 
have a look at the following:

Atr <- cbind(rep(1:0, each = 4), 1, c(1, rep(0, 7)), 1)
unSpells <- colSums(Atr == 0)
unSpells[unSpells == 0] <- 1
unSpells


I hope it helps.

Best,
Dimitris


Mario Lavezzi wrote:
> Hello,
> I have the following problem.
> 
> I am running simulations on possible states of a set of agents 
> (1=employed, 0=unemployed).
> 
> I store these simulated time series in a matrix like the following, 
> where rows indicates time periods, columns the number of agents (4 
> agents and 8 periods in this case):
> 
> Atr=[
> 1    1    1    1
> 1    1    0    1
> 1    1    0    1
> 1    1    0    1
> 0    1    0    1
> 0    1    0    1
> 0    1    0    1
> 0    1    0    1]
> 
> At this point, I need to update a vector ("unSpells") which contains the 
> lenghts of unemployment spells, and is initialized with ones. 
> Practically, in the case represented I need to store the value "4" at 
> position 1 of unSpells and "7" at position 3 of unSpells (that is, I 
> care only of those who, in the last row, are zeros).
> 
> I am doing this in the following way (tt+1 indicates the time period 
> reached by the simulation, n the number of agents):
> 
>    unSpells = matrix(1,nrow=1,ncol=n)      ppp=apply(Atr[1:(tt+1),],2,rle)
>    for(i in (1:n)[Atr[tt+1,]==0]){
>        unSpells[i]=tail(ppp[[i]]$lengths,1)
>    }
> 
> It works, but the for (i in ...) loop slows down the simulation a lot.
> 
> Any suggestion on how to avoid this loop? (or in general, to speed up 
> this part of the simulation)
> 
> Thanks!!
> Mario
> 

-- 
Dimitris Rizopoulos
Assistant Professor
Department of Biostatistics
Erasmus Medical Center

Address: PO Box 2040, 3000 CA Rotterdam, the Netherlands
Tel: +31/(0)10/7043478
Fax: +31/(0)10/7043014



More information about the R-help mailing list