日记大全

日记大全 > 句子大全

掌握R语言for循环一文就够了(认真脸)

句子大全 2013-05-31 13:36:17
相关推荐

嗨,大家好,我就是帅气的小编~

R语言是进行统计分析和可视化的优秀语言(其实机器学习和网页制作也可以用R,小声说~|ω`))

相信大家在利用R语言进行数据分析的时候可能会有大数据分析需求。所谓大数据,很好理解,就是大样本高维度数据,这样的数据在当今信息爆炸时代,很是常见。比如医学数据,数据量大,维度极高,因为医学的检测指标多,而且随着基因测序特别是二代测序等高通量测序(High-throughput sequencing)技术的普及,能一次测上万的基因,这样就有几万的维度;各种真实世界的统计数据,这些数据比如汽车损耗、公司盈亏也有着大样本的特点。

那么大数据如此的多,批处理的需求就比较大了。R语言不考虑并行运算下的简单批处理实现方式就是for循环。

所以,今天就来教大家怎样掌握R语言的for循环o(^▽^)o

首先,你需要一个R,百度"R"就行,点击有官网标识的网站,进去下载就行

打开R或rstudio(都行,小编喜欢rstudio,支持代码补全、鼠标操作GUI等功能,用过就不再想用普通的R了)

在左侧光标处就可以输入你的代码了

for循环基本结构如下

for(变量 in 值){}

for循环的逻辑是设定一个变量如x,x的改变范围在5到20(这个可以自己设),那么R就会自动执行{}里的内容,按x递增1的顺序执行,一直从5,6,7...到20为止。

那么接下来,小编就通过一个具体的例子来讲解for循环(′▽`〃)

代码都是本人自己写的哈~

首先编一个二维矩阵数据,这样的数据是很常见的(如果有现成的文件也可以用read.csv/read.table/read.delim读入data.frame格式的数据,再用as.matrix函数转为矩阵)

#这步是新建一个名为data的矩阵,matrix函数后面的c(1:5000)是矩阵填入的数据,是从1,2,3...一直填到5000,nrow是矩阵的行数,可以理解为number of rows,ncol是矩阵的列数,可以理解为number of columns,所以明白了为啥要填5000个数了吧(`)

data <- matrix(c(1:5000),nrow = 100,ncol = 50)

可见1到5000是按列填充的,这就是R语言的一个特性,默认优先进行列运算~

我现在想要进行for循环了,首先明确我的目的是想计算每一行之间的pearson相关系数和P值,最后得到一个4列的data.frame并输出为csv,可用excel进行进一步编辑。4列的data.frame每一列依次是某一行的行名、与前者进行相关分析的另一行的行名、pearson相关系数、P值,那么让我们开始~

N1=c("gene1") #首先把最后4列的data.frame表头设定好,我这里用基因1表示,可以随你换

N2=c("gene2")

R=c("r") #相关系数

P=c("p") #P值

for (r in 1:nrow(data)){ #在下面的{}内r的范围从1到data的行数,即100

for (t in r:nrow(data)){ #在下面的{}内t的范围从1到data的行数,两个for叠加的话,先固定第一个for r=1再执行下一个for,直到下一个for的r从1到100都执行完后再跳到第一个for r=2,再执行r从1到100,再r=3以此类推直到r=100,整个for循环就结束了。这里用两个for很巧妙,这样可以规避计算了第r行与t行的相关数据及第t行与r行的相关数据,造成人为的重复运算

N3=rownames(data)[t] #data行名的第t个数据,这个很好理解,data行名rownames(data)是一个有100个数据的向量vector,从1到100依次是每一行的行名,这里[t]就取第t个数即第t行行名

N4=rownames(data)[r] #同上取第r行行名

R1=cor(as.numeric(data[t,]),as.numeric(data[r,]),method="pearson") #cor函数计算pearson相关系数,参数里依次是向量1,向量2,运算方法这里是pearson,向量1这里是data第t行的数据,保险起见转为了numeric即数值型,向量2这里是data第r行的数据

P1=cor.test(as.numeric(data[t,]),as.numeric(data[r,]),method="pearson")[[3]] #结构同上,这里是得到P值

N1=c(N1,N3) #把N1和N3合并为N1,这里N1最开始是gene1,后来每运行一次,就加上一个新的N3,也就是每运行一次,就得到长度加一的向量,加的部分就是相关分析中前者的行名

N2=c(N2,N4) #把N2和N4合并为N2,这里N2最开始是gene2,后来每运行一次,就加上一个新的N4,也就是每运行一次,就得到长度加一的向量,加的部分就是相关分析中后者的行名,注意N1和N2的顺序是一一对应的,因为N1和N2的顺序就是每次运行的顺序,即N1和N2的第3个数据都是第2次运算的结果

R=c(R,R1) #把N2和N4合并为R,这里R最开始是r,后来每运行一次,就加上一个新的R1,也就是每运行一次,就得到长度加一的向量,加的部分就是相关分析中相关系数

P=c(P,P1) #把N2和N4合并为P,这里P最开始是p,后来每运行一次,就加上一个新的P1,也就是每运行一次,就得到长度加一的向量,加的部分就是相关分析中的P值,注意R和P及N1、N2都是一一对应的,理由同上

}

}

Q=data.frame(N1,N2,R,P) #最后把N1,N2,R,P向量按列合并创建成data.frame,因为R和P及N1、N2都是一一对应的,按列合并不会打乱顺序,至于为啥是按列,这里就是前文说的R语言特性~

write.csv(Q,file="G:/PR1.csv") #输出为csv

这就是结果,为啥N1,N2不变呢?因为没有设定行名所以每次运算的N3、N4都是空的,所以N1,N2一直都是gene1和gene2。为啥R为1P为0呢?因为看了data就知道了(o)

怎么样,R语言for循环有意思吧︿( ̄︶ ̄)~,你学会了吗?不妨用自己的数据试试~

最后,学习程序语言,小编觉得理解代码逻辑非常重要(来自一个自学R语言、生物信息学和机器学习的临床医学生)

小编资料——武汉大学临床医学专业在读,已发表多篇SCI论文。这是小编的第一篇文章,希望大家多多关注、支持,你们的支持是我走下去的动力

你们还想看怎样的文章,不妨在评论区谈一谈,对于R语言或者这篇文章其他内容也可以谈一谈~

阅读剩余内容
网友评论
相关内容
拓展阅读
最近更新