[R] counting run lengths

Domenico Vistocco vistocco at unicas.it
Mon Oct 27 11:09:03 CET 2008

```Try this:
unSpells[tail(Atr,1)==0] <-
apply(Atr,2,function(x)sum(x==0))[tail(Atr,1)==0]

Or (if you don't have to preserve the value in the unSpells vector):
unSpells <- apply(Atr,2,function(x)sum(x==0))
But in this case you have 0 instead of 1 in the second and fourth position.

Ciao,
domenico

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
>

```