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

提交評論