Hi R-users,
I have a matrix similar to this. I would like to calculate the number
of 1 sequences in a row and also the length of the 1 sequence. For
instance, in the example below, row number one has four sequences of
number 1 (from left to right: 1; 1; 1,1; 1) and the corresponding
SeqCount is 4 and SeqLenght 1,1,2,1.
g <- c(0,0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1 ,1 ,0 ,1 ,1 ,1 ,0 ,1
,1 ,0 ,1 ,1 ,0 ,1 ,0 ,1 ,0 ,1 ,1 ,1 ,1 ,0 ,1 ,0 ,1 ,1 ,1 ,1 ,0 ,1 ,1
,1 ,1 ,0 ,1 ,1 ,0 ,1 ,0 ,0 ,1 ,0 ,0 ,0 ,1 ,0 ,1 ,0 ,0 ,1 ,1 ,0 ,1 ,1
,0 ,0 ,1 ,0 ,1 ,0 ,0 ,1 ,1 ,0 ,1 ,1 ,0 ,0 ,0 ,0 ,0 ,1 ,1 ,1 ,0 ,1 ,1
,0 ,0 ,1 ,0 ,0 ,1 ,1 ,0 ,1)
dim(g) <- c(10,10)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0 1 0 0 1 0 1 1 0 1
[2,] 0 1 1 1 1 1 0 0 0 0
[3,] 1 0 1 1 0 0 0 1 0 0
[4,] 1 1 0 1 1 0 1 0 0 1
[5,] 0 1 1 1 1 1 1 0 0 0
[6,] 1 1 1 0 1 0 0 1 1 0
[7,] 1 0 0 1 1 0 1 1 1 1
[8,] 1 1 1 0 0 0 1 0 1 1
[9,] 1 1 0 1 1 1 0 1 0 0
[10,] 1 1 1 1 1 0 0 1 1 1
The resulting datafmame should look like this:
x <- "Rownumber SeqCount SeqLenght
1 4 1
1 4 1
1 4 2
1 4 1
2 1 5
3 3 1
3 3 2
3 3 1
4 4 2
4 4 2
4 4 1
4 4 1
5 1 6
6 3 3
6 3 1
6 3 2
7 3 1
7 3 2
7 3 4
8 3 3
8 3 1
8 3 2
9 3 2
9 3 3
9 3 1
10 2 5
10 2 3"
x <- read.table(textConnection(x), header=TRUE)
x
Any idea how to do this in R?
Best regards,
Lauri
Dimitris Rizopoulos
2007-Nov-13 13:40 UTC
[R] How to count the number of sequences in matrix?
one approach is the following:
res <- apply(g, 1, function (x) {
out <- rle(as.logical(x))
out <- out$lengths[out$values]
ln <- length(out)
c(rep(ln, ln), out)
})
cbind(rep(1:nrow(g), sapply(res, length) / 2),
do.call("rbind", sapply(res, matrix, ncol = 2)))
I hope it helps.
Best,
Dimitris
----- Original Message -----
From: "Lauri Nikkinen" <lauri.nikkinen at iki.fi>
To: <r-help at stat.math.ethz.ch>
Sent: Tuesday, November 13, 2007 2:07 PM
Subject: [R] How to count the number of sequences in matrix?
> Hi R-users,
>
> I have a matrix similar to this. I would like to calculate the
> number
> of 1 sequences in a row and also the length of the 1 sequence. For
> instance, in the example below, row number one has four sequences of
> number 1 (from left to right: 1; 1; 1,1; 1) and the corresponding
> SeqCount is 4 and SeqLenght 1,1,2,1.
>
> g <- c(0,0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1 ,1 ,0 ,1 ,1 ,1 ,0
> ,1
> ,1 ,0 ,1 ,1 ,0 ,1 ,0 ,1 ,0 ,1 ,1 ,1 ,1 ,0 ,1 ,0 ,1 ,1 ,1 ,1 ,0 ,1 ,1
> ,1 ,1 ,0 ,1 ,1 ,0 ,1 ,0 ,0 ,1 ,0 ,0 ,0 ,1 ,0 ,1 ,0 ,0 ,1 ,1 ,0 ,1 ,1
> ,0 ,0 ,1 ,0 ,1 ,0 ,0 ,1 ,1 ,0 ,1 ,1 ,0 ,0 ,0 ,0 ,0 ,1 ,1 ,1 ,0 ,1 ,1
> ,0 ,0 ,1 ,0 ,0 ,1 ,1 ,0 ,1)
> dim(g) <- c(10,10)
> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
> [1,] 0 1 0 0 1 0 1 1 0 1
> [2,] 0 1 1 1 1 1 0 0 0 0
> [3,] 1 0 1 1 0 0 0 1 0 0
> [4,] 1 1 0 1 1 0 1 0 0 1
> [5,] 0 1 1 1 1 1 1 0 0 0
> [6,] 1 1 1 0 1 0 0 1 1 0
> [7,] 1 0 0 1 1 0 1 1 1 1
> [8,] 1 1 1 0 0 0 1 0 1 1
> [9,] 1 1 0 1 1 1 0 1 0 0
> [10,] 1 1 1 1 1 0 0 1 1 1
>
> The resulting datafmame should look like this:
> x <- "Rownumber SeqCount SeqLenght
> 1 4 1
> 1 4 1
> 1 4 2
> 1 4 1
> 2 1 5
> 3 3 1
> 3 3 2
> 3 3 1
> 4 4 2
> 4 4 2
> 4 4 1
> 4 4 1
> 5 1 6
> 6 3 3
> 6 3 1
> 6 3 2
> 7 3 1
> 7 3 2
> 7 3 4
> 8 3 3
> 8 3 1
> 8 3 2
> 9 3 2
> 9 3 3
> 9 3 1
> 10 2 5
> 10 2 3"
> x <- read.table(textConnection(x), header=TRUE)
> x
>
> Any idea how to do this in R?
>
> Best regards,
> Lauri
>
> ______________________________________________
> 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.
>
Disclaimer: http://www.kuleuven.be/cwis/email_disclaimer.htm
James W. MacDonald
2007-Nov-13 21:01 UTC
[R] How to count the number of sequences in matrix?
Hi Lauri,
A quick hack:
a <- lapply(g, 1, rle)
b <- sapply(a, function(x), x[[1]][x[[2]] == 1])
d <- cbind(rep(1:length(b), sapply(b, length)),
rep(sapply(b, length), sapply(b, length)),
unlist(b))
Best,
Jim
Lauri Nikkinen wrote:> Hi R-users,
>
> I have a matrix similar to this. I would like to calculate the number
> of 1 sequences in a row and also the length of the 1 sequence. For
> instance, in the example below, row number one has four sequences of
> number 1 (from left to right: 1; 1; 1,1; 1) and the corresponding
> SeqCount is 4 and SeqLenght 1,1,2,1.
>
> g <- c(0,0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1 ,1 ,0 ,1 ,1 ,1 ,0 ,1
> ,1 ,0 ,1 ,1 ,0 ,1 ,0 ,1 ,0 ,1 ,1 ,1 ,1 ,0 ,1 ,0 ,1 ,1 ,1 ,1 ,0 ,1 ,1
> ,1 ,1 ,0 ,1 ,1 ,0 ,1 ,0 ,0 ,1 ,0 ,0 ,0 ,1 ,0 ,1 ,0 ,0 ,1 ,1 ,0 ,1 ,1
> ,0 ,0 ,1 ,0 ,1 ,0 ,0 ,1 ,1 ,0 ,1 ,1 ,0 ,0 ,0 ,0 ,0 ,1 ,1 ,1 ,0 ,1 ,1
> ,0 ,0 ,1 ,0 ,0 ,1 ,1 ,0 ,1)
> dim(g) <- c(10,10)
> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
> [1,] 0 1 0 0 1 0 1 1 0 1
> [2,] 0 1 1 1 1 1 0 0 0 0
> [3,] 1 0 1 1 0 0 0 1 0 0
> [4,] 1 1 0 1 1 0 1 0 0 1
> [5,] 0 1 1 1 1 1 1 0 0 0
> [6,] 1 1 1 0 1 0 0 1 1 0
> [7,] 1 0 0 1 1 0 1 1 1 1
> [8,] 1 1 1 0 0 0 1 0 1 1
> [9,] 1 1 0 1 1 1 0 1 0 0
> [10,] 1 1 1 1 1 0 0 1 1 1
>
> The resulting datafmame should look like this:
> x <- "Rownumber SeqCount SeqLenght
> 1 4 1
> 1 4 1
> 1 4 2
> 1 4 1
> 2 1 5
> 3 3 1
> 3 3 2
> 3 3 1
> 4 4 2
> 4 4 2
> 4 4 1
> 4 4 1
> 5 1 6
> 6 3 3
> 6 3 1
> 6 3 2
> 7 3 1
> 7 3 2
> 7 3 4
> 8 3 3
> 8 3 1
> 8 3 2
> 9 3 2
> 9 3 3
> 9 3 1
> 10 2 5
> 10 2 3"
> x <- read.table(textConnection(x), header=TRUE)
> x
>
> Any idea how to do this in R?
>
> Best regards,
> Lauri
>
> ______________________________________________
> 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.
--
James W. MacDonald, M.S.
Biostatistician
Affymetrix and cDNA Microarray Core
University of Michigan Cancer Center
1500 E. Medical Center Drive
7410 CCGC
Ann Arbor MI 48109
734-647-5623