[R] counting run lengths
Martin Morgan
mtmorgan at fhcrc.org
Mon Oct 27 15:28:43 CET 2008
Hi Mario --
This function
f <- function(m) {
## next 2 lines due to Bill Dunlap
## http://tolstoy.newcastle.edu.au/R/e4/devel/08/04/1206.html
csum <- cumsum(!m)
crun <- csum - cummax(m * csum)
matrix(ifelse(crun > 0, (crun-1) %% nrow(m) + 1, 0),
nrow=nrow(m))
}
returns a matrix with elements indicating the number of successive
0's so far in the column
> f(Atr)
[,1] [,2] [,3] [,4]
[1,] 0 0 0 0
[2,] 0 0 1 0
[3,] 0 0 2 0
[4,] 0 0 3 0
[5,] 1 0 4 0
[6,] 2 0 5 0
[7,] 3 0 6 0
[8,] 4 0 7 0
from which the last row is easily extracted
> f(Atr)[nrow(Atr),]
[1] 4 0 7 0
Martin
Mario Lavezzi <lavezzi at unipa.it> writes:
> 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
>
> --
> Andrea Mario Lavezzi
> Dipartimento di Studi su Politica, Diritto e Società
> Università di Palermo
> Piazza Bologni 8
> 90134 Palermo, Italy
> tel. ++39 091 6625600
> fax ++39 091 6112023
> skype: lavezzimario
> email: lavezzi (at) unipa.it
> web: http://www.unipa.it/~lavezzi
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
--
Martin Morgan
Computational Biology / Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N.
PO Box 19024 Seattle, WA 98109
Location: Arnold Building M2 B169
Phone: (206) 667-2793
More information about the R-help
mailing list