版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
DataMiningandDataAnalysiswithR數據挖掘與數據分析:基于R語言第一章R語言基礎R語言中的數據讀取和數據導出01R語言中的數據類型和對象02R語言中的控制語句及函數03R語言中的數據處理04數據處理包05章節(jié)內容1.1R語言中的數據讀取和數據導出R語言具有強大的數據統(tǒng)計與分析功能,如創(chuàng)建簡單的數據集、輸出數據集中的元素、提取數據集的子集、計算均值、計算方差等。為了提前感受R語言的強大功能,我們首先嘗試一些簡單的R語言操作:#利用2、5、8生成一個簡單的數據集xx<-c(2,5,8)#通過數據集x構造數據集qq<-c(x,x,6)#輸出x中的第二個元素x[2]輸出:[1]5#輸出q中的第三個元素q[3]輸出:[1]8#提取q中第2至第5個元素q[2:5]輸出:>q[2:5][1]5825#計算x中數據的均值mean(x)輸出:[1]5#計算q中數據的方差sd(q)輸出:[1]2.478479變量賦值和其他編程語言一樣,R語言中也存在符號變量。用戶在創(chuàng)建變量時必須使用賦值運算符“<-”給變量賦值,賦值完成后,該變量才正式創(chuàng)建完成,R語言中不允許創(chuàng)建沒有賦值的空變量。R語言中同樣支持通過符號“=”進行賦值,二者在賦值上的效果一樣,用戶可根據自身喜好選擇。#創(chuàng)建一個值為2的變量x0x0<-2輸出:>x0[1]2#修改變量x0的值x0<-4輸出:>x0[1]4從文件中讀取數據想要從外部文件中直接讀取整個數據框,文件通常需要具備特殊的格式:文件的第一行應該為數據框中的每列變量命名,其余行包括一個行標簽以及每個變量的取值。圖1-1為csv文件的格式示例。圖1-1csv文件的格式示例從文件中讀取數據常用的讀取文件數據的函數包括read.table()、read.csv()、read.delim()等。首先來看一個例子:read.table()函數中的第一個參數為要讀取文件的路徑及名稱,header用于指出文件的第一行是否為變量的名字,其默認值為FALSE。除了上述三種函數外,R語言還可以直接讀取Excel文件,具體代碼如下:HousePrice<-read.table("./HousePrices.csv",header=TRUE)HousePrice#導入xlsx包library(xlsx)#讀取myexcel.xlsx文件中的第一個工作表mydata<-read.xlsx("./myexcel.xlsx",1)#讀取myexcel.xlsx文件中表名為mysheet的工作表mydata<-read.xlsx("./myexcel.xlsx",sheetName="mysheet")從R語言的包中獲取數據在R語言中,我們不僅可以從文件中讀取數據,還可以從R語言的包中獲取數據。調用函數data()可以查看datasets包中的數據集,如圖1-2所示。我們同樣可以對這些數據進行處理分析。下面展示如何計算數據集Nile的均值和標準差:>mean(Nile)[1]919.35>sd(Nile)[1]169.2275圖1-2datasets包中的部分數據集導出數據根據導出文件格式的不同,存在多種文件導出函數。write.table()、write.csv()、write.xlsx()等函數可用于將程序中的數據導出到指定的文件夾,具體代碼如下:上述函數中的第一個參數為待導出的數據集,第二個參數為導出文件的路徑及名稱,sep為數據的分隔符。write.table(mydata,"./mydata.txt",sep="\t")write.csv(mydata,file="C:/Data/mydata.csv")write.xlsx(mydata,"./mydata.xlsx")1.2R語言中的數據類型和對象R語言是一門面向對象的語言,R語言中的所有操作都需要指明具體的操作對象,每個對象具有相應的數據類型和數據長度。本節(jié)主要介紹R語言中的數據類型和對象及其代碼實現。數據類型R語言中常用的數據類型包括數值型(numeric)、字符型(character)、復數型(complex)和邏輯型(logical),mode()函數可以指示數據類型,length()函數可以獲取數據長度。a<-64mode(a)輸出:[1]"numeric"length(a)輸出:[1]6sqrt(a)輸出:[1]8a<-"Thecatatemyhomework"sub("cat","pig",a)輸出:[1]"Thepigatemyhomework"y1<--8+3iy2<-6+5imode(y1)輸出:[1]"complex"y1+y2輸出:[1]-2+8ia<-(1+1==3)a輸出:[1]FALSEy3<-TRUE!y3輸出:[1]FALSEy4<-c(T,T,F,F,F)y5<-c(F,F,T,F,F)y4&&y5輸出:[1]FALSEy4&y5輸出:[1]FALSEFALSEFALSEFALSEFALSEy4||y5輸出:[1]TRUEy4|y5輸出:[1]TRUETRUETRUEFALSEFALSER語言中的向量R語言中有多種類型的對象,包括向量、矩陣、數據框、列表和因子。向量是R語言中最常用的一種數據類型,其結構簡潔,構造方便,可具體細分為數值型向量、字符型向量、邏輯型向量,代碼如下:向量中的元素可使用下標引用,示例如下:a<-c(1,3,6.4,7,-8,2)#數值型向量b<-c("one","two","three")#字符型向量c<-c(TRUE,FALSE,FALSE,TRUE,TRUE)#邏輯型向量#索引a中第2和第4個元素a[c(2,4)]輸出:[1]37R語言中的矩陣矩陣中所有元素的數據類型必須相同,每一列必須擁有相同的長度。矩陣使用matrix()函數創(chuàng)建,其一般形式為R語言中的數據填充是列優(yōu)先的,即byrow的默認值是FALSE,這表示矩陣在接收數據時按列填充,byrow=TRUE意味著矩陣在接收數據時按行填充。dimnames為行和列提供了可選擇的標簽,具體代碼如下:mymatrix<-matrix(vector,nrow=r,ncol=c,byrow=FALSE,dimnames=list(char_vector_rownames,char_vector_colnames)#構造一個5行4列的矩陣y<-matrix(1:20,nrow=5,ncol=4)#另一個示例cells<-c(25,64,72,48)rnames<-c("R1","R2")cnames<-c("C1","C2")mymatrix<-matrix(cells,nrow=2,ncol=2,byrow=TRUE,dimnames=list(rnames,cnames))mymatrix輸出:C1C2R12564R27248mymatrix[,2]#矩陣的第2列輸出:R1R26448mymatrix[1,]#矩陣的第1行輸出:C1C22564mymatrix[2,1]#矩陣的第2行、第1列輸出:[1]72R語言中的數據框數據框是比矩陣更通用的一種數據類型。在數據框中,不同的列可以擁有不同的數據類型,但每列的長度必須相等。數據框通常使用data.frame()函數創(chuàng)建。d<-c(1,2,3,4)e<-c("green","red","blue",NA)f<-c(FALSE,TRUE,TRUE,FALSE)mydataframe<-data.frame(d,e,f)names(mydataframe)<-c("ID","Color","Passed")mydataframe[2:3]#獲取2-3列的數據輸出:ColorPassed1greenFALSE2redTRUE3blueTRUE4<NA>FALSEmydataframe[c("ID","Passed")]#獲取列名為ID、Passed的數據輸出:IDPassed11FALSE22TRUE33TRUE44FALSEmydataframe$Color#獲取列Color的數據輸出:[1]"green""red""blue"NA圖1-3數據框mydataframeR語言中的列表列表是對象的有序組合,它可以包含不同類型的元素,比如數值、向量、矩陣或是另一個列表。列表使用list()函數創(chuàng)建:#創(chuàng)建一個包含字符串,矩陣,邏輯值向量和子列表的列表mylist<-list(c("Blue","Green"),matrix(c(23,6,3,3,9,8),nrow=2),c(FALSE,TRUE),list("Mon",91.87))names(mylist)<-c("Color","A_matrix","Logic","Inner_list")mylist輸出:$Color[1]"Blue""Green"$A_matrix[,1][,2][,3][1,]2339[2,]638$Logic[1]FALSETRUE$Inner_list$Inner_list[[1]][1]"Mon"$Inner_list[[2]][1]91.87R語言中的列表mylist[1]輸出:$Color[1]"Blue""Green"mylist$A_matrix輸出:[,1][,2][,3][1,]2339[2,]638mylist$A_matrix[1,3]輸出:[1]9mylist$Inner_list[1]輸出:[[1]][1]"Mon"R語言中的因子R語言中的因子主要用于對數據進行分組,可以記錄數據中的類別名稱及類別數目,如人的性別可以分為男性和女性,考試成績可以分為優(yōu)、良、差等。因子型變量內的所有非重復值,被稱為因子水平(levels)。在R語言中一般用factor()函數創(chuàng)建因子型變量。#創(chuàng)建一個包含5個male,8個female的向量myfactor<-c(rep("male",5),rep("female",8))#將其轉化為因子型向量myfactor<-factor(myfactor)myfactor輸出:[1]malemalemalemalemalefemalefemalefemalefemalefemalefemalefemalefemaleLevels:femalemalesummary(myfactor)輸出:femalemale85as.character(myfactor)輸出:[1]"male""male""male""male""male""female""female""female""female""female""female""female""female"eger(myfactor)輸出:[1]2222211111111class(myfactor)輸出:[1]"factor"1.3R語言中的控制語句及函數與其他編程語言類似,R語言也有控制結構,便于用戶編寫程序,將數據處理的操作程序化、規(guī)范化。R語言中的控制語句主要包括if分支、for循環(huán)、while循環(huán)以及switch語句。同時,R語言是一個函數的集合體,不僅允許用戶根據需求自定義函數,還集成了大量函數包,幫助用戶完成各種數據處理的操作。本節(jié)主要介紹R語言中的控制語句及函數。if分支if分支也被稱作條件語句,主要用來判斷相應條件下的代碼執(zhí)行內容,具體語法如下:如果if后的條件判斷為真,則執(zhí)行statements對應的語句,否則執(zhí)行alternativestatements對應的語句。if后的判斷條件可以是邏輯型向量,也可以是數值型向量。當判斷條件為數值型向量時,0代表條件為假,其余數值代表條件為真。if(logicalexpression){statements}else{alternativestatements}x<-6if(x>0){print("Positivenumber")}輸出:[1]"Positivenumber"x1<--6if(x1>0){print("Positivenumber")}else{print("Negativenumber")}輸出:[1]"Negativenumber"if分支需要注意的是,else必須與if語句的右大括號寫在同一行。上述代碼也可以寫成單獨的一行,得到的輸出結果一致。R語言的特性允許我們按以下結構編寫代碼:if(x1>0)print("Positivenumber")elseprint("Negativenumber")x2<--8x3<-if(x2>0)23else24x3輸出:[1]24
if分支當有多個條件需要判斷時,可以重復編寫if…else…if…語句,語法如下:不管有多少個判斷條件,最終只有一個條件滿足要求,也只有該條件下的語句會被執(zhí)行。由于x4的取值為0,因此它只符合else中的條件,故而執(zhí)行結果為“Zero”。if(test_expression1){statement1}elseif(test_expression2){statement2}elseif(test_expression3){statement3}else{statement4}x4<-0if(x4>0){print("Positivenumber")}elseif(x4<0){print("Negativenumber")}else{print("Zero")}輸出:[1]"Zero"
if分支向量構成了R語言的基本組成部分,R語言中的大多數函數都將向量作為輸入和輸出,這種代碼向量化的方式比單獨將相同的函數應用于向量的每個元素要快得多。與此概念類似,R語言中的if…else語句有一個向量等價形式,即ifelse()函數。ifelse()函數的語法為:ifelse(cond,statement1,statement2)x5<-c(11,6,3,7,4,91)ifelse(x5%%2==0,"even","odd")輸出:[1]"odd""even""odd""odd""even""odd"for循環(huán)循環(huán)語句是一種重要的編程語句,當存在大量重復性工作時,循環(huán)語句的價值得以充分體現,不僅能削減代碼量,還能提高編程效率,確保問題高效得到解決。for循環(huán)是經典的循環(huán)語句之一,其語法如下:上述語法中,seq是一個向量,而var在循環(huán)中取其每個值。在每次迭代的過程中,expr都會得到執(zhí)行。for(varinseq)exprx6<-c(1,32,55,64,7,86,23,9)count1<-0for(valinx6){if(val%%2==0)count1<-count1+1}print(count1)輸出:[1]3#計算1到1000之間的奇數和sum_1_1000<-0for(iin1:1000){if(i%%2==1){sum_1_1000<-sum_1_1000+i}}sum_1_1000輸出:[1]250000while循環(huán)while循環(huán)是另一種經典的循環(huán)語句,它與for循環(huán)有一定的相似之處,二者之間可以相互轉換,其語法如下:其中cond是判斷條件,當判斷條件為真時,expr將開始執(zhí)行,expr執(zhí)行結束時將重新判斷條件,若判斷條件依舊為真,expr繼續(xù)執(zhí)行,以此類推,直到判斷條件為假時循環(huán)結束。while(cond)exprx7<-1while(x7<6){print(x7)x7<-x7+1}輸出:[1]1[1]2[1]3[1]4[1]5while循環(huán)相比于for循環(huán),while循環(huán)更適合循環(huán)次數不確定的情況。由于while循環(huán)可能陷入無休止的循環(huán),因此當循環(huán)體內的函數符合某種條件時,需要借用break語句跳出循環(huán),我們來看下面的示例:#使用while循環(huán)登錄銀行賬戶while(TRUE){cardID<-readline("請輸入銀行卡號:")password<-readline("請輸入賬號密碼:")if(cardID=="123456"&password=="ILoveR666"){print("賬號登錄成功!")break}else{print("您的銀行卡號或者密碼信息有錯!")}}輸出:請輸入銀行卡號:123456請輸入賬號密碼:IlikeR[1]"您的銀行卡號或者密碼信息有錯!"請輸入銀行卡號:789456請輸入賬號密碼:ILoveR[1]"您的銀行卡號或者密碼信息有錯!"請輸入銀行卡號:123456請輸入賬號密碼:ILoveR[1]"您的銀行卡號或者密碼信息有錯!"請輸入銀行卡號:123456請輸入賬號密碼:ILoveR666[1]"賬號登錄成功!"while循環(huán)需要注意的是,while循環(huán)中的break語句非常關鍵。當用戶輸入了正確的銀行卡號和賬號密碼時,程序不僅要提示用戶登錄成功,還要跳出信息輸入的循環(huán)體,此時便要用到break語句。break語句用于結束當前循環(huán)并跳出整個循環(huán)體,若沒有break語句,則用戶即使輸入了正確的信息還會被要求繼續(xù)輸入,即while循環(huán)將陷入無休止的循環(huán),由此可見while循環(huán)中break語句的重要性。switch語句switch語句將測試的變量與列表中的值(case)進行比較,依據具體的情況選擇相應的執(zhí)行語句,其語法如下:switch語句中,如果表達式的值不是字符串,則將其默認設置為整數。switch語句中可以包含任意數量的case語句,每個case語句后面寫明要比較的值和一個冒號。如果表達式的整數值介于1和最大參數之間,則評估case語句的相應元素并返回結果。如果表達式為字符串,則該字符串需與case語句中的值完全匹配。若有多個匹配結果,則返回第一個匹配結果。當遇到沒有匹配結果時,如果函數中存在未命名的元素,則返回其值。switch(expression,case1,case2,case3…)switch語句x8<-switch(5,"blue","yellow","green","black","white","pink")x8輸出:[1]"white"x9<-c("A","b","c","D","E","f","G")#cat()函數是輸出函數的一種,當沒有輸出結果時,cat()不會輸出任何東西for(chinx9){cat(ch,":",switch(EXPR=ch,a=1,A=2,c=3,d=4,E=5,F=6,G=1:4,"default0"),"\n")}輸出:A:2b:default0c:3D:default0E:5f:default0G:1234自定義函數R語言的一項強大功能在于用戶可以添加自定義的函數。事實上,R語言中的許多函數實際上是函數的函數。函數的結構如下所示:在function()函數中,括號內的傳入參數是可選的。我們在自定義函數時,根據實際情況可以不編寫傳入參數,也可以編寫多個傳入參數。myfunction<-function(arg1,arg2…){statementsreturn(object)}#函數中沒有傳入參數的情況f1<-function(){print("IloveR!")}f1()輸出:[1]"IloveR!"#函數中有傳入參數的情況f2<-function(num_i){for(iin1:num_i){print("IloveR!")}}f2(3)輸出:[1]"IloveR!"[1]"IloveR!"[1]"IloveR!"自定義函數需要注意的是,如果自定義的函數中定義了傳入參數,則用戶在后續(xù)調用函數時必須同樣寫明傳入參數的值,否則程序會報錯,以f2()函數為例:f2()輸出:Errorinf2():缺少參數"num_i",也沒有缺省值#設置傳入參數的默認值f3<-function(num_i=2){for(iin1:num_i){print("IloveR!")}}f3()輸出:[1]"IloveR!"[1]"IloveR!"f3(1)輸出:[1]"IloveR!"為了減少上述錯誤的發(fā)生,用戶可以設置傳入參數的默認值。如果函數被調用時沒有寫明具體的傳入參數,默認的參數值則會作為傳入參數值,示例如下:自定義函數我們最后來看一個稍微復雜的示例,此示例是關于編寫矩陣轉置函數的。#矩陣的轉置f4<-function(x){if(!is.matrix(x)){warning("argumentisnotamatrix:returningNA")return(NA_real_)}y<-matrix(1,nrow=ncol(x),ncol=nrow(x))for(iin1:nrow(x)){for(jin1:ncol(x)){y[j,i]<-x[i,j]}}return(y)}f4(1)輸出:[1]NAWarningmessage:Inf4(1):argumentisnotamatrix:returningNAcf4(mymatrix2)輸出:[,1][,2][,3][1,]888[2,]889[3,]999[4,]966[5,]663[6,]333#構造一個3行6列的矩陣用于測試mymatrix2<-matrix(c(rep(8,5),rep(9,5),rep(6,4),rep(3,4)),nrow=3,ncol=6)mymatrix2輸出:[,1][,2][,3][,4][,5][,6][1,]889963[2,]889663[3,]899633R語言中的內置函數函數描述abs(x)求x的絕對值sqrt(x)求x的平方根ceiling(x)向上取整(如ceiling(3.7)=4)floor(x)向下取整(如floor(8.98)=8)trunc(x)去尾取整(如trunc(4.76)=4)round(x,digits=n)四舍五入(如round(6.7453,digits=2)=6.75)signif(x,digits=n)舍入(如signif(6.7453,digits=2)=6.7)cos(x),sin(x),tan(x)三角函數(還有:acos(x),cosh(x),acosh(x)等)log(x)自然對數函數log10(x)公用對數函數exp(x)e^x指數函數表1-1數值函數R語言中的內置函數表1-2字符函數函數描述substr(x,start=n1,stop=n2)提取或代替字符向量中的子串x<-"ILoveR"substr(x,2,5)的結果為"Love"substr(x,2,5)<-"Like"的結果為"ILikeR"grep(pattern,x,ignore.case=FALSE,fixed=FALSE)在R中搜索模式。如果fixed=FALSE,則模式是一個正則表達式。如果fixed=TRUE,則模式為文本字符串。函數返回匹配的索引。grep("D",c("A","D","c"),fixed=TRUE),返回2sub(pattern,replacement,x,ignore.case=FALSE,fixed=FALSE)在x中查找模式并替換為replacement文本。如果fixed=FALSE,則模式是一個正則表達式。如果fixed=TRUE,則模式為文本字符串。sub("\\s",".","HelloWorld"),返回值"Hello.World"strsplit(x,split)在split處拆分字符向量x的元素。strsplit("Love",""),返回值"L","o","v","e"paste(…,sep=)使用sep字符串分隔字符串后連接字符串。paste("a",1:3,sep=""),返回值為c("a1","a2","a3")paste("a",1:3,sep="O"),得c("aO1","aO2","aO3")toupper(x)大寫tolower(x)小寫R語言中的內置函數表1-3概率統(tǒng)計函數函數描述dnorm(x)正態(tài)密度函數(默認值m=0sd=1)#繪制標準正態(tài)曲線x<-pretty(c(-3,3),30)y<-dnorm(x)plot(x,y,type="I",xlab="Deviate",ylab="Density",yaxs="i")pnorm(q)q的累積正態(tài)概率(q左側正態(tài)曲線下的面積)pnorm(1.96)的結果為0.975qnorm(p)正常分位數正態(tài)分布p百分位數的值qnorm(.9)的結果為1.28rnorm(n,m=0,sd=1)n個隨機正態(tài)偏差,其中均值為m,標準偏差為sd#50個隨機正態(tài)變量,平均值=50,標準差=10x<-rnorm(50,m=50,sd=10)dbinom(x,size,prob)二項分布,其中size是樣本大小,prob是正面的概率(pi)#10次翻轉中0到5個公平硬幣正面的概率dbinom(0:5,10,.5)pbinom(q,size,prob)#在10次翻轉中出現5個或更少正面硬幣的概率pbinom(5,10,.5)qbinom(p,size,prob)給出累積值與概率值匹配的數字。#當一枚硬幣被拋101次時,有多少個正面的概率為0.4qbinom(0.4,101,1/2)輸出結果為:49rbinom(n,size,prob)從給定樣本產?給定概率的所需數量的隨機值#從200個樣本中以0.3的概率找出9個隨機值rbinom(9,200,.3)輸出結果為:535355675757695265dpois(x,lamda)泊松分布,返回發(fā)生x次隨機事件的概率ppois(q,lamda)泊松分布,返回累積概率qpois(p,lamda)泊松分布,返回相應分位點xrpois(n,lamda)泊松分布,返回每組發(fā)生隨機事件的次數dunif(x,min=0,max=1)均勻分布,分布密度punif(q,min=0,max=1)均勻分布,分布函數qunif(p,min=0,max=1)均勻分布,分位數函數runif(n,min=0,max=1)均勻分布,隨機數產生函數R語言中的內置函數表1-4其他統(tǒng)計函數函數描述mean(x,trim=0,na.rm=FALSE)計算對象x的均值trim表?截尾平均數,如:trim=0.05表示丟棄最大5%和最小的5%的數據后,再計算算術平均數。trim的取值范圍為0~0.5sd(x)計算對象x的標準差median(x)計算對象x的中位數quantile(x,probs)計算對象x的分位數range(x)計算對象x的范圍sum(x)計算對象x的和diff(x,lag=1)滯后差異min(x)計算對象x的最小數max(x)計算對象x的最大數scale(x,center=TRUE,scale=TRUE)列中心或標準化矩陣seq(from,to,by)生成序列seq(1,20,4)結果為1,5,9,13,17rep(x,ntimes)重復xntimes次cut(x,n)將因子中的連續(xù)變量除以n個水平1.4R語言中的數據處理作為一種統(tǒng)計分析軟件,R語言的優(yōu)勢在于其出色的數據處理能力,簡便而強大的編程語言以及集成的函數包使得R語言幾乎能夠勝任各種數據分析統(tǒng)計工作。本節(jié)主要介紹R語言中的各種數據處理操作。從數據集中提取信息R語言中有許多函數可以提取對象或數據集的內容。ls()函數用于列出當前工作環(huán)境中的所有對象names()函數可用于提取對象中的變量
str()函數用于展示對象的結構levels()函數可以列出因子型變量中的因子水平dim()函數用于獲取矩陣等數據類型對象的維度class()函數可用于獲取對象的數據類型直接輸入某個對象的名稱可獲取對象中包含的所有元素head()函數用于獲取數據的開頭幾行tail()函數用于獲取數據的末尾幾行從數據集中提取信息ls()輸出:[1]"a""b""c""cells""ch""cnames""d""e""f""f1"[11]"f2""f3""f4""mydataframe""myfactor""mylist""mymatrix""mymatrix2""rnames""x"[21]"x1""x2""x3""x4""x5""x8""x9"names(mydataframe)輸出:[1]"ID""Color""Passed"str(mydataframe)輸出:'data.frame':4obs.of3variables:$ID:num1234$Color:chr"green""red""blue"NA$Passed:logiFALSETRUETRUEFALSElevels(myfactor)輸出:[1]"female""male"dim(mymatrix2)輸出:[1]36class(mylist)輸出:[1]"list"#輸出mymatrix2mymatrix2輸出:[,1][,2][,3][,4][,5][,6][1,]889963[2,]889663[3,]899633#輸出mymatrix2的前2行head(mymatrix2,2)輸出:[,1][,2][,3][,4][,5][,6][1,]889963[2,]889663#輸出mymatrix2的后2行tail(mymatrix2,2)輸出:[,1][,2][,3][,4][,5][,6][2,]889663[3,]899633缺失信息處理在R語言中,缺失的信息用符號NA(notavailable)表示,不存在的數值(如除以0)用符號NaN(notanumber)表示。不同于SAS,R語言對字符型數據和數值型數據使用相同的符號。is.na()函數用于驗證數據中的缺失值,其返回值為邏輯向量,若數據為NA,則返回TRUE,否則返回FALSE。R中還允許用戶將元素重新編碼為缺失值。缺失數據會對數據分析的結果和速度造成一定的影響,因此在通常情況下,我們在進行數據分析時往往希望移除缺失數據。在R語言中通過將參數na.rm的值設置為TRUE即可達到此目的。complete.cases()函數返回一個邏輯向量,指示數據集中沒有缺失數據的部分。na.omit()函數用于返回刪除缺失值后的對象。缺失信息處理#驗證向量中的缺失值x10<-c(1,2,3,4,5,NA,7,NA,10)is.na(x10)輸出:[1]FALSEFALSEFALSEFALSEFALSETRUEFALSETRUEFALSE#將x10中的第4個元素重新編碼為缺失值x10[4]<-NAx10輸出:[1]123NA5NA7NA10x11<-c(1,23,NA,16,47,26,34,93,NA,65)mean(x11)輸出:[1]NAmean(x11,na.rm=TRUE)輸出:[1]38.125#構造一個4行5列的矩陣mydata<-matrix(c(x10,x11,34),nrow=4,ncol=5)mydata輸出:[,1][,2][,3][,4][,5][1,]15101693[2,]2NA147NA[3,]37232665[4,]NANANA3434#獲取mydata中含有缺失數據的行mydata[!complete.cases(mydata),]輸出:[,1][,2][,3][,4][,5][1,]2NA147NA[2,]NANANA3434#刪除mydata中含有缺失值的行.mydata_withoutNA<-na.omit(mydata)mydata_withoutNA輸出:[,1][,2][,3][,4][,5][1,]15101693[2,]37232665attr(,"na.action")[1]42attr(,"class")[1]"omit"運算符對于有編程基礎的讀者來說,R語言中的二進制運算符和邏輯運算符看起來將會非常熟悉,它們類似于其他編程語言中的運算符。需要注意的是,二元運算符適用于向量、矩陣以及標量。運算符描述+加法運算符-減法運算符*乘法運算符/除法運算符^或者**冪運算符x%%y模數(xmody)如:7%%2=1x%/%y整數除法運算符如:7%/%2=3運算符描述<小于<=小于等于>大于>=大于等于==等于!=不等于!x非xx|yx或yx&yx和yisTRUE(x)驗證x是否為真表1-5R語言中的算術運算符表1-6R語言中的邏輯運算符運算符我們來看一些關于運算符的具體示例:R語言中還封裝了許多常用的數據統(tǒng)計函數,如對數運算函數log20、開方函數sqrt()等,讀者可自行探索。#獲取向量x12中大于6或者小于2的元素x12<-c(1:8)x12[(x12>6)|(x12<2)]輸出:[1]178log2(9)輸出:[1]3.169925sqrt(27)輸出:[1]5.196152替換現有字段中的數據數據處理的過程中,往往需要替換現有字段中的數據,在R語言中有多種方式達到這一目的。我們首先構造一個數據框schoolData_o,該數據框中含有三個字段:ID、Grade、Status,每個字段包含8個元素,其中sample()函數為取樣函數,用于隨機打亂字段Grade和Status中的元素順序。原始數據框構造完畢后,我們將其復制到數據框schoolData中,之后所有的操作都在schooData上進行。值得一提的是,每開始一輪新的操作,將重置schoolData中的元素為schoolData_o,schoolData_o中的元素如圖1-4所示。圖1-4schoolData_o中的元素替換現有字段中的數據#把數據框schoolData中Grade字段的全部元素替換成數值5schoolData<-schoolData_oschoolData$Grade<-5schoolData輸出:IDGradeStatus115open225open335close445close555open665close775open885closeschoolData<-schoolData_oschoolData$Grade<-"Five"schoolData輸出:IDGradeStatus11Fiveopen22Fiveopen33Fiveclose44Fiveclose55Fiveopen66Fiveclose77Fiveopen88FivecloseschoolData<-schoolData_oschoolData$Grade<-NAschoolData輸出:IDGradeStatus11NAopen22NAopen33NAclose44NAclose55NAopen66NAclose77NAopen88NAclose下面將用幾個示例展現如何替換R語言中現有字段中的數據。替換現有字段中的數據#把數據框schoolData中Grade字段內取值為5的元素替換成GradeFiveschoolData<-schoolData_oschoolData$Grade[schoolData$Grade==5]<-"GradeFive"schoolData輸出:IDGradeStatus111open223open334close442close55GradeFiveopen66GradeFiveclose772open88GradeFiveclose#把數據框schoolData中Grade字段內取值小于等于5的元素替換成GradeFiveorLessschoolData<-schoolData_oschoolData$Grade[schoolData$Grade<=5]<-"GradeFiveorLess"schoolData輸出:IDGradeStatus11GradeFiveorLessopen22GradeFiveorLessopen33GradeFiveorLessclose44GradeFiveorLessclose55GradeFiveorLessopen66GradeFiveorLessclose77GradeFiveorLessopen88GradeFiveorLesscloseschoolData<-schoolData_oschoolData$Grade[1:4]<-NAschoolData$Grade[is.na(schoolData$Grade)]<-"MissingGrade"schoolData輸出:IDGradeStatus11MissingGradeopen22MissingGradeopen33MissingGradeclose44MissingGradeclose555open665close772open885close下面展示了如何應用條件以便僅替換特定行中的數據。需要注意的是,如果想用某個值替換NA,則不能使用"value"=="NA",必須使用is.na()函數。替換現有字段中的數據#找到數據框schoolData中Grade字段內取值等于5,且Status字段內值為open的行,把該行Type字段元素賦值為ElementaryschoolData<-schoolData_oschoolData$Type[schoolData$Grade==5&schoolData$Status=="open"]<-"Elementary"schoolData輸出:IDGradeStatusType111open<NA>223open<NA>334close<NA>442close<NA>555openElementary665close<NA>772open<NA>885close<NA>下面展示了如何根據多個條件替換數據。#將數據框schoolData中Grade字段內的元素復制到新列CopyOfGrade中schoolData<-schoolData_oschoolData$CopyOfGrade<-schoolData$GradeschoolData輸出:IDGradeStatusCopyOfGrade111open1223open3334close4442close2555open5665close5772open2885close5下面展示了如何復制現有字段。替換現有字段中的數據#在數據框schoolData中創(chuàng)建一個新的字段NewGradeschoolData<-schoolData_oschoolData$NewGrade<-NA#將原Grade字段中數值為5的元素賦值到NewGrade中schoolData$NewGrade[schoolData$Grade==5]<-5schoolData輸出:IDGradeStatusNewGrade111openNA223openNA334closeNA442closeNA555open5665close5772openNA885close5下面基于字段Grade創(chuàng)建一個名為NewGrade的新字段。替換現有字段中的數據#創(chuàng)建兩個成績類別schoolData<-schoolData_oschoolData$GradeCat<-ifelse(schoolData$Grade>3,c("good"),c("bad"))schoolData輸出:IDGradeStatusGradeCat111openbad223openbad334closegood442closebad555opengood665closegood772openbad885closegood為了重新編碼數據,我們可能會使用一種或多種R語言的控制結構。在數據框中創(chuàng)建字段GradeCat,并依據字段Grade中的數值創(chuàng)建三個成績類別bad、middle、good。與前面提過的示例一樣,我們可以再次使用邏輯運算符&或任何其他運算符來生成我們想要的條件:#創(chuàng)建三個成績類別schoolData<-schoolData_oattach(schoolData)schoolData$GradeCat[Grade>3]<-"good"schoolData$GradeCat[Grade>1&Grade<=3]<-"middle"schoolData$GradeCat[Grade<=1]<-"bad"detach(schoolData)schoolData輸出:IDGradeStatusGradeCat111openbad223openmiddle334closegood442closemiddle555opengood665closegood772openmiddle885closegood變量的重命名在數據處理的過程中,有時為了提高編碼的效率與可讀性,我們需要修改數據集中某幾列的變量名,這在R語言中有多種實現方式。我們首先構造一個簡單的數據框simpleData_o,該數據框包含五個字段:ID、Color、Logic、Float、Mix,每個字段包含3個元素。原始數據框構造完畢后,我們將其復制到數據框simpleData中,之后所有的操作都在simpleData上進行。值得一提的是,每開始一輪新的操作,將重置simpleData中的元素為simpleData_o,simpleData_o中的元素如圖1-5所示。圖1-5simpleData_o中的元素#更改前兩列的名稱simpleData<-simpleData_onames(simpleData)<-c("NewID","NewColor")simpleData輸出:NewIDNewColorNANANA11redTRUE1.5-31.022blueTRUE2.44.533yellowFALSE3.6-6.0下面展示了如何更改數據框中列的名稱。在沒有其他條件的情況下,程序將從第一列開始改名,直到用完提供的名稱。#更改列Logic的名稱simpleData<-simpleData_ocolnames(simpleData)[colnames(simpleData)=="Logic"]<-"NewLogic"simpleData輸出:IDColorNewLogicFloatMix11redTRUE1.5-31.022blueTRUE2.44.533yellowFALSE3.6-6.0下面展示了如何通過使用列名稱來標識將要被更改名稱的列。以下代碼將數據框中名為Logic的字段重命名為NewLogic。變量的重命名#更改第4列的名稱simpleData<-simpleData_onames(simpleData)[4]<-"NewFloat"simpleData輸出:IDColorLogicNewFloatMix11redTRUE1.5-31.022blueTRUE2.44.533yellowFALSE3.6-6.0下面展示了如何使用列號來標識將要被更改名稱的列。以下代碼將數據框中的第4列重命名為NewFloat。在實際使用的過程中,應盡量避免使用列號標識改名這種方法。因為如果列的順序發(fā)生更改,它將錯誤地改變列的名稱。變量的重命名數字的四舍五入是一種常見的數據處理方式,在R語言中主要通過round()函數實現這一功能,其語法如下:數字的四舍五入round(x,digits)其中,x為待舍入的數,digits用于指定四舍五入保留的小數位數。我們將使用之前構造過的數據框simpleData進行操作。第一個示例將數據框simpleData中的Float字段的數字四舍五入到整數位,并將四舍五入的數字保存回同一字段。round()函數如果未指定小數位數,則默認四舍五入到整數位。#數字的四舍五入simpleData<-simpleData_osimpleData$Float<-round(simpleData$Float)simpleData輸出:IDColorLogicFloatMix11redTRUE2-31.022blueTRUE24.533yellowFALSE4-6.0simpleData$Color<-round(simpleData$Color)輸出:Errorinround(simpleData$Color):數學函數中用了非數值參數數字的四舍五入我們通常會將舍入后的數值保存在新的字段中,保留原始數據以供以后使用。下面的這段代碼是正確的。#保留舍入前的原始數據simpleData<-simpleData_osimpleData$FloatRounded<-round(simpleData$Float)simpleData輸出:IDColorLogicFloatMixFloatRounded11redTRUE1.5-31.0222blueTRUE2.44.5233yellowFALSE3.6-6.04#指定要舍入的小數位數simpleData<-simpleData_osimpleData$FloatRounded<-round(simpleData$Float,0)simpleData輸出:IDColorLogicFloatMixFloatRounded11redTRUE1.5-31.0222blueTRUE2.44.5233yellowFALSE3.6-6.04下面展示了如何指定要舍入的小數位數。子集數據R語言具有強大的索引功能來訪問對象元素,這些特征可用于選擇和排除變量及觀察值。R語言中通過使用符號“[]”指定向量、矩陣、數組或數據框內單個元素的索引或名稱,從而實現訪問這些元素的目的。#訪問simpleData第2行第4列的元素simpleData<-simpleData_osimpleData[2,4]輸出:[1]2.4#訪問simpleData第2行Logic列的元素simpleData[2,"Logic"]輸出:[1]TRUE#訪問simpleData中Mix列的元素simpleData[,"Mix"]輸出:[1]-31.04.5-6.0#通過數值向量訪問1-3列simpleData[,c(1:3)]輸出:IDColorLogic11redTRUE22blueTRUE33yellowFALSE#通過邏輯向量訪問1、3、4列simpleData[,c(T,F,T,T)]輸出:IDLogicFloatMix11TRUE1.5-31.022TRUE2.44.533FALSE3.6-6.0#通過名稱訪問第5列simpleData$Mix輸出:[1]-31.04.5-6.0#在邏輯向量中比較結果simpleData$Color=="blue"輸出:[1]FALSETRUEFALSE#訪問字段Float中元素值大于2的行simpleData[simpleData$Float>2,]輸出:IDColorLogicFloatMix22blueTRUE2.44.533yellowFALSE3.6-6.0子集數據#保留字段ID、Float、Mix中的數據partVars<-c("ID","Float","Mix")simpleDataPart1<-simpleData[partVars]simpleDataPart1輸出:IDFloatMix111.5-31.0222.44.5333.6-6.0#保留第1和第3-5個字段的數據simpleDataPart2<-simpleData[c(1,3:5)]simpleDataPart2輸出:IDLogicFloatMix11TRUE1.5-31.022TRUE2.44.533FALSE3.6-6.0#刪除字段Float、Mix中的數據simpleData$Float<-simpleData$Mix<-NULLsimpleData輸出:IDColorLogic11redTRUE22blueTRUE33yellowFALSE#排除字段ID、Float、Mix中的數據partVars2<-names(simpleData)%in%c("ID","Float","Mix")simpleDataPart3<-simpleData[!partVars2]simpleDataPart3輸出:ColorLogic1redTRUE2blueTRUE3yellowFALSE#排除第2和第4個字段的數據simpleDataPart4<-simpleData[c(-2,-4)]simpleDataPart4輸出:IDLogicMix11TRUE-31.022TRUE4.533FALSE-6.0子集數據#保留schoolData中前五行觀察值schoolData<-schoolData_oschoolDataPart1<-schoolData[1:5,]schoolDataPart1輸出:IDGradeStatus111open223open334close442close555open#上述的另一種方式attach(schoolData)schoolDataPart3<-schoolData[which(Grade>2&Status=="open"),]detach(schoolData)schoolDataPart3輸出:IDGradeStatus223open555open#保留schoolData中Grade值大于2且Status值為open的觀察值schoolDataPart2<-schoolData[which(schoolData$Grade>2&schoolData$Status=="open"),]schoolDataPart2輸出:IDGradeStatus223open555open子集數據我們在保留變量和觀察值時,也可以運用子集函數subset(),該函數是保留變量和觀察值的最簡單的方式之一。下面的例子中,我們通過subset()函數找出數據框schoolData中的Grade字段大于3或者Status字段為close的行,并保存相應的ID字段中的元素。#使用subset()函數schoolDataPart4<-subset(schoolData,Grade>3|Status=="close",select=c(ID))schoolDataPart4輸出:ID3344556688#使用subset()函數schoolDataPart5<-subset(schoolData,Grade>3|Status=="close",select=c(ID:Status))schoolDataPart5輸出:IDGradeStatus334close442close555open665close885close隨機抽樣從總體中選擇樣本的方式有很多,其中常用的一種就是隨機抽樣。在R語言中,通過sample()函數可以模擬隨機抽樣過程,其語法如下:sample(x,size,replace=FALSE,prob=NULL)#從1-50中隨機抽取10個數sample(1:50,10)輸出:[1]18811342173630312#從schoolDataPart6中隨機抽取5行數據schoolDataPart6<-schoolData[sample(1:nrow(schoolData),5,replace=FALSE),]schoolDataPart6輸出:I
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 燈光設計師的工作總結
- 機械行業(yè)安全操作培訓
- 超高清視頻技術發(fā)展趨勢
- 廣東省深圳市南山區(qū)2023-2024學年六年級上學期英語期末試卷
- 財務工作一年績效總結
- 《深部鉆探論壇廈門》課件
- 《花瓣的哲學》課件
- 《執(zhí)行力密碼》課件
- 2023年廣東省韶關市公開招聘警務輔助人員輔警筆試自考題2卷含答案
- 2021年湖南省常德市公開招聘警務輔助人員輔警筆試自考題2卷含答案
- (新版)電網規(guī)劃專業(yè)知識考試題庫(含答案)
- 學校心理危機干預流程圖
- 杏醬生產工藝
- 融資擔保業(yè)務風險分類管理辦法
- 年會抽獎券可編輯模板
- 靜電場知識點例題結合
- 道德寶章·白玉蟾
- GB∕T 41170.2-2021 造口輔助器具的皮膚保護用品 試驗方法 第2部分:耐濕完整性和黏合強度
- 防雷裝置檢測質量管理手冊
- 水上拋石護坡施工方案
- 燃氣鍋爐房和直燃機房防爆問題
評論
0/150
提交評論