Dear R-users: Sorry to bother so late with this question, which surely has simple answer. I'm working with matrices that contain either "1" or "0", for example: [,1] [,2] [,3] [,4] [,5] A 1 0 1 0 0 B 0 1 0 1 0 C 1 0 1 0 0 D 1 1 1 0 1 I want to count the number of "1" common to, say, A and B, the number of "1" that appear only in A and the number of "1" that appear only in B. Please let me know if there's a simple way of doing this without the complicated for...next loops that have come across my mind. Fredy Mej?a -------------- next part -------------- A non-text attachment was scrubbed... Name: not available Type: text/enriched Size: 656 bytes Desc: not available Url : https://stat.ethz.ch/pipermail/r-help/attachments/20020830/e6781301/attachment.bin
Counting elements in 2 rows of a matrix
2 messages · Fredy Mejía, Jan de Leeuw
x
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 1 0 0
[2,] 0 1 0 1 0
[3,] 1 0 1 0 0
[4,] 1 1 1 0 1
> table(x[1,],x[2,])
0 1
0 1 2
1 2 0
> as.vector(table(x[1,],x[2,]))
[1] 1 2 2 0
>prs<-function(x,i,j) as.vector(table(x[i,],x[j,])[2:4])
> prs(x,1,2)
[1] 2 2 0
> prs(x,1,3)
[1] 0 0 2
or use
ab.common<-function(x) crossprod(t(x))
ab.unique<-function(x) outer(rowSums(x),rep(1,nrow(x)))-pr11(x)
The first function will give what two rows have in common, the
second will give what they have unique (01 below the
diagonal, 10 above)
> ab.common(x)
[,1] [,2] [,3] [,4]
[1,] 2 0 2 2
[2,] 0 2 0 1
[3,] 2 0 2 2
[4,] 2 1 2 4
> ab.unique(x)
[,1] [,2] [,3] [,4]
[1,] 0 2 0 0
[2,] 2 0 2 1
[3,] 0 2 0 0
[4,] 2 3 2 0
For ab.unique you can also use
ab.unique <-function(x) matrix(rowSums(x), nrow(x),nrow(x))-ab.common(x)
which may be marginally faster.
On Friday, August 30, 2002, at 10:22 PM, Fredy Mej?a wrote:
Dear R-users: Sorry to bother so late with this question, which surely has simple answer. I'm working with matrices that contain either "1" or "0", for example: [,1] [,2] [,3] [,4] [,5] A 1 0 1 0 0 B 0 1 0 1 0 C 1 0 1 0 0 D 1 1 1 0 1 I want to count the number of "1" common to, say, A and B, the number of "1" that appear only in A and the number of "1" that appear only in B. Please let me know if there's a simple way of doing this without the complicated for...next loops that have come across my mind. Fredy Mej?a
=== Jan de Leeuw; Professor and Chair, UCLA Department of Statistics; US mail: 9432 Boelter Hall, Box 951554, Los Angeles, CA 90095-1554 phone (310)-825-9550; fax (310)-206-5658; email: deleeuw at stat.ucla.edu homepage: http://gifi.stat.ucla.edu ------------------------------------------------------------------------ ------------------------- No matter where you go, there you are. --- Buckaroo Banzai http://gifi.stat.ucla.edu/sounds/nomatter.au ------------------------------------------------------------------------ ------------------------- -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html Send "info", "help", or "[un]subscribe" (in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._