[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
>
More information about the R-help
mailing list