# [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))
> n.test <- sapply(seq_len(n.iteration), function(i)
+      wilcox.test(pc1.eigv~p[i,])\$p.value)
> n.test
 1.0000000 0.6666667 0.6666667 1.0000000 0.6666667 0.6666667
 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.914806 1.937075 1.286140 1.830448 1.914806 1.937075 1.286140
 1.830448
> tf[1:2, ] # First row combines rows 2 and 1, second 3 and 1, etc
  TRUE FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE
[2,] FALSE  TRUE FALSE  TRUE FALSE TRUE TRUE FALSE
> n.iteration <- dim(tf)
> 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
 0.6572552 0.6572552 1.0000000 0.6572552 0.6572552 1.0000000
 0.6572552 0.6572552 1.0000000 0.6572552 0.3005223 1.0000000
 0.6572552 0.3005223 1.0000000 0.6572552 1.0000000 0.3005223
 0.6572552 1.0000000 0.3005223 0.6572552 0.6572552 1.0000000
 0.6572552 0.6572552 1.0000000 0.6572552 0.3005223 1.0000000
 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))
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