[R] counting run lengths
Dimitris Rizopoulos
d.rizopoulos at erasmusmc.nl
Mon Oct 27 11:14:54 CET 2008
then try the following:
Atr <- cbind(rep(1:0, each = 4), 1, c(1, rep(0, 7)), 1)
Atr <- rbind(c(0, 1, 0, 1), Atr)
apply(Atr, 2, function (x) {
rr <- rle(x)
if (tail(rr$values, 1) == 0) tail(rr$length, 1) else 0
})
I hope this what you're looking for.
Best,
Dimitris
Mario Lavezzi wrote:
> Hi Dimitris, thank you very much.
> Actually, I have not specified the following: i want to consider only
> the "most recent" sequence of zeros, that is the last part of the time
> series.
>
> That is, If I have:
>
> [,1] [,2] [,3] [,4]
> [1,] 0 1 0 1
> [2,] 1 1 1 1
> [3,] 1 1 0 1
> [4,] 1 1 0 1
> [5,] 1 1 0 1
> [6,] 0 1 0 1
> [7,] 0 1 0 1
> [8,] 0 1 0 1
> [9,] 0 1 0 1
>
> I want to store the values (4 0 7 0) in unSpells. That is the values
> that represent the "last" sequence of zeros (that is I want to ignore
> other possible zeros like the ones I have inserted above).
>
> thanks!
> Mario
>
>
>
> Dimitris Rizopoulos wrote:
>> 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