for循环的理解与应用

构建一个虚拟数据,来完成基因之间的批量分析

# 先产生一个矩阵
data<-matrix(rnorm(120),nrow=20,ncol = 6)
##模仿一个矩阵数据
rownames(data)<-paste("gene",1:20,sep = "")
colnames(data)<-paste("sample",1:6,sep ="" )
head(data)
##          sample1    sample2     sample3    sample4     sample5    sample6
## gene1  0.4990478 -0.3660286 -1.67747446  1.2152064  0.36704041  0.4426596
## gene2  0.4137370 -0.5759078 -1.05686047  2.3791852  0.16012042  0.1116411
## gene3 -1.3810102 -2.2091688 -0.04397986  1.1043156 -0.02498766  0.2022606
## gene4 -0.5869116 -1.4709767 -1.00648437 -0.3828667 -1.31701773  0.4458708
## gene5 -1.9125251 -0.3051966  1.61747167 -0.8524583 -0.28413794 -1.3215508
## gene6  0.6544889 -0.5892970 -0.32164520 -0.2571762  0.24715474 -0.3288907

实现批量完成基因间的相关系数计算

###首先明确实现这个目的可以使用for循环 ### 构建好需要得出的结果表,包括基因名,相关系数,Pvalue

###首先创建空向量

gene_name1<-c()
gene_name2<-c()
cor_r<-c()
pvalue<-c()

准备好循环体-可使用嵌套的for循环,完成完整的计算但不重复

注意第二个for循环的值为 i: nrow(data),这一点很巧妙

for (i in 1:nrow(data)){
  for (r in i:nrow(data)){
    g1=rownames(data)[i]
    g2=rownames(data)[r]
    c_r=cor(as.numeric(data[i,]),as.numeric(data[r,]),method="pearson")
    p=cor.test(as.numeric(data[i,]),as.numeric(data[r,]),method ="pearson")[[3]]
    ##保存每一步的数据,而不可直接以空向量作为每一步运行的结果
    gene_name1=c(gene_name1,g1)
    gene_name2=c(gene_name2,g2)
    cor_r=c(cor_r,c_r)
    pvalue=c(pvalue,p)
       }
}

###输出为数据框,导出结果

data_cor<-data.frame(gene_name1,gene_name2,cor_r,pvalue)
head(data_cor)
##   gene_name1 gene_name2      cor_r     pvalue
## 1      gene1      gene1  1.0000000 0.00000000
## 2      gene1      gene2  0.8621872 0.02717984
## 3      gene1      gene3  0.3032010 0.55913529
## 4      gene1      gene4  0.4343741 0.38941794
## 5      gene1      gene5 -0.8329406 0.03953206
## 6      gene1      gene6  0.3329173 0.51907333
dim(data_cor)
## [1] 210   4