[R] counting strings of identical values in a matrix

Marc Schwartz marc_schwartz at comcast.net
Thu Nov 15 17:36:21 CET 2007


Ah...OK. I misunderstood then. I thought that you wanted the number of
runs of 1's in each column.

This is actually easier, _if_ there is not an overlap of 1's from the
end of one column to the start of the next column:

res <- rle(as.vector(prova))

> res
Run Length Encoding
  lengths: int [1:11] 2 2 2 2 3 3 5 4 2 1 ...
  values : int [1:11] 3 1 3 1 3 1 3 1 3 1 ...

> table(res$lengths[res$values == 1])

1 2 3 4 
1 2 1 1 


HTH,

Marc


On Thu, 2007-11-15 at 17:18 +0100, A M Lavezzi wrote:
> Dear Marc
> thank you so much!
> 
> One thing: writing xx=[1,2,1,1] is not a typo: I 
> read it as the count of runs of different length starting from 1.
> 
> In "prova" I have 1 run of length one, 2 runs of 
> length two, 1 run of length three and 1 run of length four.
> 
> Can I abuse of your time  and ask how to do this?
> 
> Thanks again
> Mario
> 
> At 16.48 15/11/2007, you wrote:
> 
> >On Thu, 2007-11-15 at 15:51 +0100, A M Lavezzi wrote:
> > > Hello
> > >
> > > I have this problem. I have a large matrix of this sort:
> > >
> > >  > prova
> > >       [,1] [,2] [,3] [,4]
> > > [1,]    3    3    3    3
> > > [2,]    3    3    3    1
> > > [3,]    1    3    3    3
> > > [4,]    1    1    1    3
> > > [5,]    3    1    1    3
> > > [6,]    3    1    1    3
> > > [7,]    1    3    1    3
> > > [8,]    1    3    3    3
> > >
> > > What I want to do is to count the number of
> > > sequences of ones and stack the results in a
> > > vector, which I will subsequently use to build an istogram (or a density)
> > >
> > > I mean: in the matrix "prova" I have two
> > > sequences of length two in column 1, one sequence
> > > of length three in column 2, one sequence  of
> > > length four in column 3 and one sequence of
> > > length one in column 4. (I know I can actually
> > > turn the matrix into a vector by using rep(prova))
> > >
> > > I would like to get to a vector such as : xx = [1,2,1,1]
> >
> >I presume a typo above and that it should be:
> >
> >   xx = [2,1,1,1]
> >
> >?
> >
> >If so:
> >
> > > unlist(lapply(apply(prova, 2, rle),
> >                 function(x) length(x$lengths[x$values == 1])))
> >[1] 2 1 1 1
> >
> >
> >See ?rle to get the basics of identifying runs of values.
> >
> >HTH,
> >
> >Marc Schwartz
> 
> ===============================
> Andrea Mario Lavezzi
> Dipartimento di Studi su Politica Diritto e Società
> Piazza Bologni 8
> 90134 Palermo
> tel. ++39 091 6625600
> fax ++39 091 6112023
> skype: lavezzimario
> email: lavezzi at unipa.it
> web: http://www.unipa.it/~lavezzi
> =============================== 
>



More information about the R-help mailing list