R: How to write a for loop that reads every two lines in a matrix?

亡梦爱人 提交于 2019-12-11 14:23:59

问题


I want to calculate correlation statistics using cor.test(). I have a data matrix where the two pairs to be tested are on consecutive lines (I have more than thousand pairs so I need to correct for that also later). I was thinking that I could loop through every two and two lines in the matrix and perform the test (i.e. first test correlation between row1 and row2, then row3 and row4, row5 and row6 etc.), but I don't know how to make this kind of loop.

This is how I do the test on a single pair:

d = read.table(file="cor-test-sample-data.txt", header=T, sep="\t", row.names = 1)
d = as.matrix(d)
cor.test(d[1,], d[2,], method = "spearman")

回答1:


You could try

 res <-  lapply(split(seq_len(nrow(mat1)),(seq_len(nrow(mat1))-1)%/%2 +1),
               function(i){m1 <-  mat1[i,]
                if(NROW(m1)==2){ 
                 cor.test(m1[1,], m1[2,], method="spearman")
                  }
                else NA 
         })

To get the p-values

 resP <- sapply(res, function(x) x$p.value)
 indx <- t(`dim<-`(seq_len(nrow(mat1)), c(2, nrow(mat1)/2)))
 names(resP) <- paste(indx[,1], indx[,2], sep="_")
 resP  
 #       1_2        3_4        5_6        7_8       9_10      11_12      13_14 
 #0.89726818 0.45191660 0.14106085 0.82532260 0.54262680 0.25384239 0.89726815 
 #     15_16      17_18      19_20      21_22      23_24      25_26      27_28 
 #0.02270217 0.16840791 0.45563229 0.28533447 0.53088721 0.23453161 0.79235990 
 #    29_30      31_32 
 #0.01345768 0.01611903 

Or using mapply (assuming that the rows are even)

  ind <- seq(1, nrow(mat1), by=2) #similar to the one used by @CathG in for loop
  mapply(function(i,j) cor.test(mat1[i,], mat1[j,],
                method='spearman')$p.value , ind, ind+1) 

data

set.seed(25)
mat1 <- matrix(sample(0:100, 20*32, replace=TRUE), ncol=20)    



回答2:


Try

d = matrix(rep(1:9, 3), ncol=3, byrow = T)
sapply(2*(1:(nrow(d)/2)), function(pair) unname(cor.test(d[pair-1,], d[pair,], method="spearman")$estimate))



回答3:


pvalues<-c()    

for (i in seq(1,nrow(d),by=2)) {
        pvalues<-c(pvalues,cor.test(d[i,],d[i+1,],method="spearman")$p.value)
}

names(pvalues)<-paste(row.names(d)[seq(1,nrow(d),by=2)],row.names(d)[seq(2,nrow(d),by=2)],sep="_")


来源:https://stackoverflow.com/questions/26755653/r-how-to-write-a-for-loop-that-reads-every-two-lines-in-a-matrix

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!