# [R] applying wilcox.test to every combination of rows in a matrix (pairwise)

David L Carlson dcarlson at tamu.edu
Wed Dec 9 18:35:56 CET 2015

```If I understand correctly, this should do what you want, but there will be warnings for each test about p-values not being exact because you reuse the pc1.eigv vector for each row so that each value occurs twice:

First we can simplify the original comparisons by using the formula mode for wilcox.test:

> p<-matrix(c(rep(c(F,T,F),3), rep(c(T,F,T),3), rep(c(T,T,F),3),
+      rep(c(F,F,T),3)), ncol=4)
> set.seed(42)
> pc1.eigv<-runif(4, 1.0, 2.0)
> n.iteration=dim(as.matrix(p))[1]
> n.test <- sapply(seq_len(n.iteration), function(i)
+      wilcox.test(pc1.eigv~p[i,])\$p.value)
> n.test
[1] 1.0000000 0.6666667 0.6666667 1.0000000 0.6666667 0.6666667
[7] 1.0000000 0.6666667 0.6666667

Then we generate the row combinations:

> rows <- expand.grid(i=1:9, j=1:9) # All 81 row combinations
> rows <- rows[rows\$j < rows\$i, ] # Just the 36 distinct combinations
> vals <- rep(pc1.eigv, 2)  # Double the pc1.eigv vector
> tf <- cbind(p[rows[, 1] ,], p[rows[, 2], ]) # Create the combined row vector
> vals # The same values for all comparisons
[1] 1.914806 1.937075 1.286140 1.830448 1.914806 1.937075 1.286140
[8] 1.830448
> tf[1:2, ] # First row combines rows 2 and 1, second 3 and 1, etc
[1]  TRUE FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE
[2,] FALSE  TRUE FALSE  TRUE FALSE TRUE TRUE FALSE
> n.iteration <- dim(tf)[1]
> n.test2 <- sapply(seq_len(n.iteration), function(i)
+      wilcox.test(vals~tf[i,])\$p.value)
There were 36 warnings (use warnings() to see them)
> n.test2
[1] 0.6572552 0.6572552 1.0000000 0.6572552 0.6572552 1.0000000
[7] 0.6572552 0.6572552 1.0000000 0.6572552 0.3005223 1.0000000
[13] 0.6572552 0.3005223 1.0000000 0.6572552 1.0000000 0.3005223
[19] 0.6572552 1.0000000 0.3005223 0.6572552 0.6572552 1.0000000
[25] 0.6572552 0.6572552 1.0000000 0.6572552 0.3005223 1.0000000
[31] 0.6572552 1.0000000 0.3005223 0.6572552 0.6572552 1.0000000

-------------------------------------
David L Carlson
Department of Anthropology
Texas A&M University
College Station, TX 77840-4352

-----Original Message-----
From: R-help [mailto:r-help-bounces at r-project.org] On Behalf Of debra ragland via R-help
Sent: Wednesday, December 9, 2015 10:00 AM
To: R-help
Subject: Re: [R] applying wilcox.test to every combination of rows in a matrix (pairwise)

Sorry for the repost, but I want to clarify that I am trying to apply the wilcox.test to every pairwise combination of rows i.e. row 1 with row 2, row 1 with row 3, row 1 with row 4 and so on until all row combinations have been achieved.

On Wednesday, December 9, 2015 7:49 AM, debra ragland <ragland.debra at yahoo.com> wrote:
Hello All,

I have written the following loop which will apply/split the same vector of numbers (pc1.eigv) to each (logical) row of a matrix and run a wilcox.test on those values that line up with TRUE and those that line up with FALSE. It works fine. However, I am now interested in using the same vector and (logical)matrix run the wilcox.test only this time I would like information about pairs of rows (not just single rows as it already does).

The loop:
n.iteration=dim(as.matrix(p))[1]
n.test= rep(NA, n.iteration )
for( i in 1:n.iteration ){  ## i=1
i_spl<-split(pc1.eigv, p[i,])
if( sum(p[i,])==15 | sum(p[i,])==0) { n.test[i]=NA  }
if( sum(p[i,])!=15 & sum(p[i,])!=0) {
testout=wilcox.test(i_spl\$'TRUE', i_spl\$'FALSE')
n.test[i]=testout\$p.value     }
}

some sample data
p<-matrix(c(rep(c(F,T,F),3), rep(c(T,F,T),3), rep(c(T,T,F),3), rep(c(F,F,T),3)), ncol=4)

pc1.eigv<-runif(4, 1.0, 2.0)

After some searching I thought that perhaps the combn function would help me (i.e. combn(nrow(p),2) for the same loop but I get an error.

Can anyone help with this?

______________________________________________
R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help