R初学者指南2-实例应用_第1页
R初学者指南2-实例应用_第2页
R初学者指南2-实例应用_第3页
R初学者指南2-实例应用_第4页
R初学者指南2-实例应用_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

示例应用一(视频教程):模拟产生统计专业同学的名单(学号区分),记录数学分析、线性代数、概率统计三课成绩第一步:录入信息num=seq(10378001,10378100)num//产生100个元素x1=round(runif(100,min=80,max=100))//用runif产生100个均匀分布(取到每一个数值的可能性是相同的)的随机数(带小数),round四舍五入,从而组成向量x1x2=round(rnorm(100,mean=80,sd=7))//rnorm产生100个正态分布的随机数,均值是80,标准差是7x3=round(rnorm(100,mean=83,sd=18))〃同理产生x3,输出结果后发现有些超过了100分(因为正态分布没有上下限的概念,只有均值和标准差)x3[which(x3>100)]=100〃把超过100分的人的成绩变成100,which找出超过100分的人的下标,再用下标定位到相关元素并将其改为100第二步:合成数据框或用write.table保存到硬盘中x=data.frame(num,x1,x2,x3)〃用data.frame将4个变量合成一个数据框x中第三步:进行计算使用mean(),colMeans(),apply()—下章介绍mean(x)[1]NA警告信息:Inmean.default(x):参数不是数值也不是逻辑值:回覆NA〃这里不能直接使用mean()函数,只能对某一变量进行求平均值,如mean(x1),mean(x2)等colMeans(x)〃对列进行求均值,colMeans中的M必须大写numx1x2x310378050.5090.4380.3981.66colMeans(x)[c("x1","x2","x3")]//指定显示某列的均值x1x2x390.4380.3981.66apply(x,2,mean)//apply是对x这个数据框在行(或列)方向上做指定操作,1代表行方向,2代表列方向,综上所述,就是在x这个数据框中在列的方向上求平均值numx1x2x310378050.5090.4380.3981.66第四步:使用apply求各科最高最低分apply(x,2,max)numx1x2x31037810010099100apply(x,2,min)numx1x2x310378001806546第五步:使用apply求出每人的总分apply(x[c("x1","x2","x3")],1,sum)〃在行的方向上求和,注意跟colMeans()的异同第六步:which.max找出总分最高的同学(找下标)

which.max(apply(x[c("x1","x2","x3")],1,sum))//求出总分最高的那个人在向量中的下标(第74个)[1]74x$num[which.max(apply(x[c("x1","x2","x3")],1,sum))]//把下标带回到x,x$num代表在数据框x中取num列,再取下标为72的元素,就能确定其学号是多少[1]10378074第七步:对x1进行直方图分析-绘制直方图函数hist()hist(x$x1)第八步:探索各科成绩的关联关系-散点图绘制函数plotHtsG^gramof疇sd第九步:列联表分析-列联函数table(),柱状图绘制函数barplot()pie(table(x$x1))pie(table(x$x1))table(x$x1)//统计每个分数有多少人(众数)80818283848586878889909192939495969798255536473553682445119910052barplot(table(x$x1))饼图:

S6,68823981909190SO■10094S6,68823981909190SO■1009495箱线图:箱子的上下横线为样本的25%和75%分位数,中间的横线为样本的中位数上下延伸的直线称为尾线,尾线的尽头为最高值和最低值boxplot(x$x1,x$x2,x$x3)boxplot(x[2:4],col=c("red","green","blue"),notch=T)#将三种颜色定义为变量,notch决定缺口水平放置的箱尾图boxplot(x$x1,x$x2,x$x3,horizontal=T)TOC\o"1-5"\h\zR-I{||I"-I—-|||…■!--「IIiii507090*星相图:R02a茎叶图:>stem(x$x1)#因x1是由round(runif(100,min=80,max=100))生成出来,所以..为何出现000000?Thedecimalpointisatthe|80|000000082|000000000084|00000000086|0000000000088|0000000090|0000000092|0000000000000094|00000096|00000000098|0000000000000000100|00stem(x$x2)#但x2由round(rnorm(100,mean=80,sd=7))生成出来,就不会像x1那样出现000000Thedecimalpointis1digit(s)totherightofthe||5689|0111122222233344444444|5555566777777788888999|0000111111222233344444|555566778888889999|00001223344|9QQ图:(回归分析:判断部分样本是否服从正太分布)num=seq(10378001,10378100)x1=round(runif(100,min=80,max=100))x2=round(rnorm(100,mean=80,sd=7))x3=round(rnorm(100,mean=83,sd=18))x3[which(x3>100)]=100x=data.frame(num,x1,x2,x3)stem(x$x1)qqnorm(x1)qqline(x1)qqnorm(x2)qqline(x2)qqnorm(x3)qqline(x3)应用实例二:循环第1步:载入数据并查看数据类型,熟悉变量名>setwd("d:/RBook")>Owls=read.table(file="Owls.txt",header=TRUE)>names(Owls)#查看变量名>str(Owls)#查看数据框中每个变量的属性第2步:绘制散点图并添加标签,提取一个鸟巢的数据,绘出同胞协商对到达到达时间的散点图>unique(Owls$Nest)#提取一个鸟巢的数据前,先要弄清楚鸟巢的名字,即鸟巢名字的截面分别有哪些Owls.ATV=Owls[Owls$Nest=='AutavauxTV',]#定义一个名为Owls.ATV的数据框,使得该数据框中的行是原有数据框Owls中Nest向量名为AutavauxTV所在的行Owls.ATV#查看新的数据框中的值NestFoodTreatmentSexParentArrivalTimeSiblingNegotiationBroodSizeNegPerChickAutavauxTVDeprivedMale22.25450.8AutavauxTVSatiatedMale22.38050.0:JDOoo®°oooogLOonwcoo0」no>(QLImqu.91.s1062n#为了绘制散点图,需提取Owls.ATV中ArrivalTime和NegPerChick向量>plot(x=Owls.ATV$ArrivalTime,#提取作为x轴的数据(为ArrivalTime)y=Owls.ATV$NegPerChick,#提取作为y轴的数据(为NegPerChick」no>(QLImqu.91.s1062n#左图为变量ArrivalTime即鸟巢中到达时间对每次访问协商行为NegPerChick的散点图第3步:设计通用代码同理,对第二个截面也就是第二个鸟巢Bochet作同样的操作,只需将主标题名称、数据框名称和实际的数据替换掉就可以了,>Owls.Bot=Owls[Owls$Nest=='Bochet',]°oc□cooo®coccao」no>cLI①q匚.2le405QN>plot(x=Owls.Bot$ArrivalTime,y=Owls.Bot$NegPerChick,xlab="ArrivalTime",ylab="Negotiationbehaviour",main="Bochet")#但是这是一个繁琐的操作,通过设计一个通用的代码有助于化简这种繁琐的输入方式并减少出错率,在这里,只需将变动的那一部分也就是」no>cLI①q匚.2le405QNNest.i="Bochet"#把要替换的部分定义为一个变量Owls.i=Owls[Owls$Nest==Nest.i,]#即使换了一个鸟巢也无需更改此处的变量>plot(x=Owls.i$ArrivalTime,y=Owls.i$NegPerChick,xlab="ArrivalTime",ylab="Negotiationbehaviour",main=Nest.i)第四步:将其输出的图像保存为jpg文件setwd("d:/RBook")Owls=read.table(file="Owls.txt",header=TRUE)Nest.i="Bochet"Owls.i=Owls[Owls$Nest==Nest.i,]YourFileName=paste(Nest.i,".jpg",sep="")#创建一个文件名,用paste命令来连接“Bochet”和“jpg”这两个字符串,并且之间不加空格,paste命令的输出就是一个可以被用来作为文件名的字符串,可以使用一个变量来存储它并将其应用到jpeg命令中,使用YourFileName作为文件名,R就将介于jpeg和dev.off命令之间的绘图结果存储到这个文件中>jpeg(file=YourFileName)#打开一个jpeg文件>plot(x=Owls.i$ArrivalTime,y=Owls.i$NegPerChick,xlab="ArrivalTime",ylab="Negotiationbehaviour",main=Nest.i)#在这个文件中绘制图像dev.off()#将jpeg文件关闭,只有在完成绘图工作后才会生成一个.jpeg文件nulldevice1第五步:使用loop命令构造循环在完成上一步后,仍需将变量名Nest.i更改27次,这将由loop命令完成,在上一步骤的代码中加入for循环setwd("d:/RBook")Owls=read.table(file="Owls.txt",header=TRUE)#从Rbook文件夹里读取数据AllNests=unique(Owls$Nest)#使用unique函数确定Owls中Nest向量中的唯一值,并把这些唯一值存放到一个新的名为AllNests的向量中作为生成.jpeg文件的文件名for(iin1:27){#在键入“{”后回车再键入往下的代码,光标就会自动显示为+号,表示代码还没结束继续输入+setwd("d:/RBook/Graphs6.2")#指定所要输出的文件夹名称,这里是Graphs6.2文件夹#这里就不像上面那样重新定义Nest.i=AllNests[i]来替代原来的Nest.i="Bochet"而是直接用AllNests[i]了,令AllNests[i]与第i个鸟巢的名字是等价的+Owls.i=Owls[Owls$Nest==AllNests[il.]#以下代码在前面的步骤中已讨论+YourFileName=paste(AllNests[i].".jpg",sep="")#生成一个名为YourFileName后加.jpeg的文件+jpeg(file=YourFileName)#打开这个.jpeg文件,并作图+plot(x=Owls.i$ArrivalTime,y=Owls.i$NegPerChick,xlab="ArrivalTime",ylab="Negotiationbehaviour",main=AllNests[i])+dev.off()+}#在Graphs6.2文件夹中就可以得到27个.jpeg文件了G田+dev.off()+}#在Graphs6.2文件夹中就可以得到27个.jpeg文件了G田ph話.2t、.屯凸■电駐r放住MM口。«BBooi■好侃护初佻Mb汕柑pflLwwjosMumtjpgPdjrreiPBXliyjpv*商*w上阪13榊旳曲俺知EHdblOE.JpQP9&xnei|pQ吹1删>■ZiaMTBt»话怎・jflE*巨芒哄W£.圉片-5traJVTfc*■JiH齐嗣示例应用三:使用ifelse句型来避免检查大量的if指令第1步:载入并评估数据>setwd("d:/RBook")>Benthic=read.table(file="RIKZ.txt",header=TRUE)>Species=Benthic[,2:76]#重新选取第2到76列的物种数据>n=dim(Species)>n[1]4575#查看数据框Spcies的行数和列数第2步:每个站点的生物总量:单纯统计!sum(Species[1,],na.rm=TRUE)[1]143#通过Spcies[1,]来获取第一行的所有列即站点1的全部生物数量之和为了避免将这个命令重复写45遍,因此构造一个循环来计算每个站点的总数TA=vector(length=n[1])#必须首先用vecto指令将TA定义为一个长度为45的向量,否则TA[i]将会报错for(iin1:n[1]){#需确定循环中的变量i必须在1到45之间,比如TA[46]就是无定义的+TA[i]=sum(Species[i,],na.rm=TRUE)#像上述那样获取每一行的总数并将其赋值到TA[冲+}TA[1]143527019967944241192211483514738101477384864229[24]04333346746571110235269927850193423011不需要构造循环体,直接使用rowSums命令计算每一行的和TA=rowSums(Species,na.rm=TRUE)TA#同样能得到相同的结果第3步:每个站点的丰富度(所拥有的物种数量):判断+统计01数量!由sum(Species[1,],na.rm=TRUE)可以得知某个站点的全部生物数量的总和(站点一的所有列相加)现在,想统计站点1的物种数量sum(Species[1,]>0,na.rm=TRUE)[1]11#在站点1中有11个不同的物种sum#Species[1,]>0为一个判断型的语句,生成了一个长度为75的布尔向量(元素就是T和F),当加入“>0”后,函数不再是统计站点1所有物种数量的总和,而是将TRUE转化为1,FALSE转化为0,然后对其进行相加为了计算每个站点的丰富度,类似地,同样构造一个循环sumRichness=vector(length=n[1])for(iin1:n[1]){+Richness[i]=sum(Species[i,]>0,na.rm=TRUE)+}Richness[1]111013111089819176143313314322606541642[32]113435750711302#同样也可以使用rowSums,同样能得出相同的结果Richness=rowSums(Species>0,na.rm=TRUE)Richness第4步:每个站点的香农指数>RS=rowSums(Species,na.rm=TRUE)#得到每一个站点的物种数量>prop=Species/RS#将Species中的每个元素除以RS并将结果存储到prop中>prop#数据量较大在此不列出>H=-rowSums(prop*log10(prop),na.rm=TRUE)>H[1]0.761906390.720972240.846735240.530839260.744139390.125131640.401920060.29160667第5步:结合代码并将代码置入到函数中通过一个选择,把之前的所得到的三种指数的代码结合起来,基于rowSums函数Index.function=function(Species,choice){#定义一个可选择的函数,其中if(choice=="TA"){Index=rowSums(Species,na.rm=TRUE)}if(choice=="Richness"){Index=rowSums(Species>0,na.rm=TRUE)}if(choice=="H"){RS=rowSums(Species,na.rm=TRUE)prop=Species/RSlndex=-rowSums(prop*log10(prop),na.rm=TRUE)}#跟之前的一样,将三段代码融到函数中,并赋到Index中list(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论