初涉R語言這本書,看了前兩章推盛,有了如下總結(jié)峦阁。
1.首先是R語言數(shù)據(jù)分析的流程,如下圖耘成。
總結(jié):R語言運(yùn)行進(jìn)行數(shù)據(jù)分析的流程:數(shù)據(jù)首先導(dǎo)入榔昔,然后對(duì)數(shù)據(jù)進(jìn)行整理,擬合一個(gè)模型瘪菌,然后進(jìn)行評(píng)估及交叉驗(yàn)證撒会,開始正式預(yù)測(cè)效果,最終生成報(bào)告师妙。
2R程序中诵肛,數(shù)據(jù)的類型包括向量、矩陣默穴、數(shù)據(jù)框怔檩、列表褪秀。數(shù)據(jù)框與數(shù)據(jù)集類似,列表就是各種對(duì)象的集合薛训。使用<-進(jìn)行賦值媒吗。R中多數(shù)功能是由程序內(nèi)置函數(shù)和用戶自編函數(shù)提供的,一次交互式會(huì)話期間的所有數(shù)據(jù)對(duì)象都被保存在內(nèi)存中乙埃。R語言也可以如C語言等一樣可以寫注釋闸英,需要在語句后加上#。一些基本函數(shù)是默認(rèn)直接可用的膊爪,其他高級(jí)函數(shù)則包含在按需加載的程序包中自阱。
3R語言也有大量幫助功能嚎莉,內(nèi)置幫助系統(tǒng)提供了安裝包中所有函數(shù)的細(xì)節(jié)米酬、參考文獻(xiàn)與使用示例。Help.start()會(huì)打開瀏覽器窗口趋箩。Rsitesearch()可在在線幫助手冊(cè)和R-Help郵件列表討論存檔中搜索指定主題赃额。Vignette()返回的文檔一般是PDF格式的文章。
4.工作空間就是R語言的工作環(huán)境叫确,儲(chǔ)存著用戶定義的對(duì)象跳芳。當(dāng)前的工作目錄是R用來讀取文件和保存結(jié)果的默認(rèn)目錄。
函數(shù)getwd()是查看當(dāng)前目錄竹勉,setwd()是設(shè)置當(dāng)前目錄飞盆。如果要調(diào)用不在當(dāng)前目錄的文件,需要標(biāo)明目錄次乓。
setwd("D:/數(shù)據(jù)分析/project")
options()
options(digits=3)#顯示小后三位有效數(shù)字的格式
x<- runif(20) #包含20均勻分布隨面變量的向量
summary(X) #生成數(shù)據(jù)的摘要統(tǒng)計(jì)量
hist(x) #計(jì)算數(shù)據(jù)的直方差
savehistory()#將歷史文件保存到文件.rhistory中
save.image()#將歷史數(shù)據(jù)保存到文件R.data中
q()#結(jié)束吓歇,退出程序
5編好了代碼的腳本最終需要輸入與輸出,source()函數(shù)會(huì)在當(dāng)前會(huì)話中執(zhí)行腳本票腰。Sink()將輸出重定向到指定的文件中城看,也可以用如下函數(shù)重定向圖形輸出。最后dev.off()將輸出返回到終端杏慰。
整個(gè)流程是這樣的:
6. R語言中用戶貢獻(xiàn)了許多模塊包测柠,其他用戶可以自行下載使用。使用函數(shù)install.packages()調(diào)用缘滥,使用library()載入包,libPaths()顯示包的位置轰胁。Search()可以知道哪些包已加載并使用。
講完了第一章R語言的總體概念朝扼,就需要從最初的數(shù)據(jù)導(dǎo)入開始赃阀,最早涉及就是數(shù)據(jù)結(jié)構(gòu)的分類,然后依照不同渠道將數(shù)據(jù)導(dǎo)入吟税。所以有了第二章凹耙。
1.數(shù)據(jù)結(jié)構(gòu)包括標(biāo)量姿现、向量、矩陣肖抱、數(shù)組备典、數(shù)據(jù)框和列表。
數(shù)據(jù)框是R中用于存儲(chǔ)數(shù)據(jù)的一種結(jié)構(gòu)意述,可以存儲(chǔ)不同類型包括數(shù)值型提佣、字符型的變量。因子是名義型變量或有序型變量荤崇。它在R中被特殊存儲(chǔ)和處理拌屏。
1.1向量:是用于存儲(chǔ)數(shù)值型、字符型或邏輯型數(shù)據(jù)的一維數(shù)組术荤。C()創(chuàng)建向量,方括號(hào)訪問向量里面的值倚喂。
> a<-c(1,5,6,7,8,9)
> a[4]
[1] 7
> a<-c(1,5,6,7,8,9)
> a[4]
[1] 7
> a[c(1,3,5)]
[1] 1 6 8
> a<-c(1,5,6,7,8,9)
> a[4]
[1] 7
> a[c(1,3,5)]
[1] 1 6 8
> a[c(1:3)]
[1] 1 5 6
1.2 .矩陣
矩陣是個(gè)二維數(shù)組。公式:
Myymatrix<-matix(vector,nrow=number_of_rows,ncol=number_of_columns,byrow=logical_value,dimnames=list(char_vector_rowname,char_vector,colnames))vector是指矩陣元素瓣戚,nrow是指矩陣行數(shù)端圈,ncol是指矩陣列數(shù),byrow是分配數(shù)據(jù)按行或列排列子库,默認(rèn)是列,dimnames是指定行和列的名稱舱权。
創(chuàng)建矩陣:
> y<-matrix(1:25,nrow=5,ncol=5) #創(chuàng)建一個(gè)5X5的矩陣
> y
[,1] [,2] [,3] [,4] [,5]
[1,]16111621
[2,]27121722
[3,]38131823
[4,]49141924
[5,]510152025
> cells<-c(2,6,89,56) #創(chuàng)建一個(gè)2X2的矩陣
>rname<-c("a1","a2")
>cname<-c("b1","b2")
> mymatrix1<-matrix(cells,nrow=2,ncol=2,byrow=FALSE,dimnames=list(rname,cname))
#數(shù)值按列填充,默認(rèn)是列填充
> mymatrix1
b1 b2
a12 89
a26 56
>
mymatrix2<-matrix(cells,nrow=2,ncol=2,byrow=TRUE,dimnames=list(rname,cname))
#數(shù)值按行填充
> mymatrix2
b1 b2
a126
a2 89 56
矩陣下標(biāo)的使用
> x<-matrix(1:20,nrow=2)
> x
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]135791113151719
[2,]2468101214161820
> x[2,]
[1]2468 1012 14 16 18 20
> x[,5]
[1]9 10
> x[2,8]
[1] 16
> x[1,c(6,7)]
[1] 11 13
1.3數(shù)組
數(shù)組格式:myarray<-array(vector,dimensions,dimnames)
Array代表是一個(gè)數(shù)組仑嗅,dimension是維度標(biāo)簽列表宴倍,是可選項(xiàng),系統(tǒng)可自動(dòng)列出名稱
>dim1<-c("a1","a2")#標(biāo)識(shí)維度名稱標(biāo)簽仓技,此處是一維
>
dim2<-c("b1","b2","b3") #標(biāo)識(shí)維度名稱標(biāo)簽鸵贬,此處是二維
>
dim3<-c("c1","c2","c3","c4") #標(biāo)識(shí)維度名稱標(biāo)簽,此處是三維
>z<-array(1:24,c(2,3,4),dimnames=list(dim1,dim2,dim3))
> z
, , c1
b1 b2 b3
a1135
a2246
, , c2
b1 b2 b3
a179 11
a28 10 12
, , c3
b1 b2 b3
a1 13 15 17
a2 14 16 18
, , c4
b1 b2 b3
a1 19 21 23
a2 20 22 24
1.4數(shù)據(jù)框
此數(shù)據(jù)類型為多種模式浑彰,可以是數(shù)字型恭理,也可以是字符串型,還有其它郭变,但同一組數(shù)據(jù)類型需要一致颜价。數(shù)據(jù)框可有函數(shù)data.frame構(gòu)建。
格式data<-data.frame(col1,col2,col3)
> patientID<-c(1,2,3,4) #數(shù)值型
> age<-c(22,45,67,89)#數(shù)值型
>
diabetes<-c("Type1","Type2","Type1","Type2")
#字符串型
> status
#字符串型
>
patientdata<-data.frame(patientID,age,diabetes,status) #組建數(shù)據(jù)框
> patientdata
patientID age diabetesstatus
1122Type1Poor
2245Type2Improved
3367Type1 Excellent
4489Type2Poor
選取數(shù)據(jù)框中的數(shù)據(jù)
> patientdata[1,2]
[1] 22
> patientdata[1:2]
patientID age
1122
2245
3367
4489
> patientdata[,2]
[1] 22 45 67 89
>patientdata[c("diabetes","status")]
diabetesstatus
1Type1Poor
2Type2Improved
3Type1 Excellent
4Type2Poor
另外此函數(shù)可生成兩個(gè)變量的聯(lián)表table(patientdata$diabetes,patientdata$status)
table(patientdata$diabetes,patientdata$status),這里理解類似于excel里的pivot.
Excellent Improved Poor
Type1101
Type2011
Ps:Attach(),detach(),with()可以簡化代碼诉濒,不用重復(fù)鍵入數(shù)據(jù)框周伦。但Attach(),detach()也有局限,如果新定義了一個(gè)同名稱的變量未荒,雖是同名专挪,但變量數(shù)據(jù)不一時(shí),則就不能調(diào)出新定義的數(shù)據(jù)框,它僅對(duì)原始定義數(shù)據(jù)框有效寨腔。
> attach(mtcars) #此函數(shù)可以數(shù)據(jù)框添加到R的搜索路徑中速侈,當(dāng)遇到一個(gè)變量后,將檢查搜索徑中的數(shù)據(jù)框迫卢,以定位到這個(gè)變量倚搬。
> summary(mpg)
Min. 1st Qu.MedianMean 3rd Qu.Max.
10.4015.4219.2020.0922.8033.90
> plot(mpg,disp)
1.5因子
類別變量和有序類別變量在R中稱為因子。函數(shù)factor()以一個(gè)整數(shù)向量的形式存儲(chǔ)類別值乾蛤,整數(shù)的取值范圍是[1,K].
譬如在糖尿病事例中每界,將status各種情況設(shè)置向量編碼,type設(shè)置為向量編碼家卖。相當(dāng)于原本以字符串形式出現(xiàn)的數(shù)據(jù)將其統(tǒng)一賦值設(shè)置為整型數(shù)字向量眨层。如果表示有序型變量,需要指定參數(shù)ordered=true.
> patientID<-c(1,2,3,4) #以向量形式輸入數(shù)據(jù)
> age<-c(22,45,67,89)
>diabetes<-c("Type1","Type2","Type1","Type2")
>status<-c("improved","poor","excellent","poor")
> diabetes<-factor(diabetes) #將病例類型定義成普通因子
> status<-factor(status,ordered=TRUE)
#將病人情況定義成有序型因子
>
patientdata<-data.frame(patientID,age,diabetes,status) #將因子型變量用數(shù)據(jù)框表現(xiàn)出來
> str(patientdata) #顯示統(tǒng)計(jì)概要
'data.frame':4 obs. of4 variables:
$patientID: num1 2 3 4
$age: num22 45 67 89
$diabetes : Factor w/ 2 levels "Type1","Type2": 1 2 1 2
$status: Ord.factor w/ 3 levels"excellent"<"improved"<..: 2 3 1 3
> summary(patientdata)
patientIDagediabetesstatus
Min.:1.00Min.:22.00Type1:2excellent:1
1stQu.:1.751st Qu.:39.25Type2:2improved :1
Median :2.50Median :56.00poor:2
Mean:2.50Mean:55.75
3rdQu.:3.253rd Qu.:72.50
Max.:4.00Max.:89.00
7列表
列表就是一些對(duì)象的有序集合上荡。列表里有若干不同數(shù)據(jù)類型的數(shù)據(jù)趴樱,列表是將它們整合到單個(gè)對(duì)象名下。用函數(shù)list創(chuàng)建列表榛臼。結(jié)構(gòu)是mylist<-(object1,object2)
> a<-c("采購訂單明細(xì)") #字符串形式
> b<-c("訂單A","訂單B","訂單C","訂單D")
> page<-c(1,10,20,50)#數(shù)字形式
> e<-c(10,34,56,78)
> cname<-c("訂單A","訂單B")
> rname<-c("單價(jià)","總價(jià)")
>
d<-matrix(e,nrow=2,ncol=2,dimnames=list(rname,cname)) #矩陣數(shù)據(jù)結(jié)構(gòu)
>
mylist<-list(title=a,name=b,pages=page,d) #列表結(jié)構(gòu)
> mylist
$title
[1] "采購訂單明細(xì)"
$name
[1] "訂單A" "訂單B" "訂單C" "訂單D"
$pages
[1]1 10 20 50
[[4]]
訂單A訂單B
單價(jià)1056
總價(jià)3478
> mylist["name"] #取出第二個(gè)對(duì)象的值
$name
[1] "訂單A" "訂單B" "訂單C" "訂單D"
> mylist[[2]]#格式與上一個(gè)不一樣伊佃,但取值內(nèi)容一樣
[1] "訂單A" "訂單B" "訂單C" "訂單D"
了解了數(shù)據(jù)結(jié)構(gòu),就需要知道數(shù)據(jù)的來源沛善,意即從何而為呢?開始了數(shù)據(jù)輸入。
2.數(shù)據(jù)的輸入塞祈,以下便是諸多的數(shù)據(jù)來源金刁。
2.1使用鍵盤輸入數(shù)據(jù):先建立一個(gè)空的數(shù)據(jù)表格,然后edit函數(shù)可幫助后面在表里錄入數(shù)據(jù)议薪。
>mydata<-data.frame(age=numeric(0),gender=character(0),weight=numeric(0))
> mydata<-edit(mydata)
此表格關(guān)閉后尤蛮,再次執(zhí)行mydata<-edit(mydata),發(fā)現(xiàn)之前內(nèi)容已保存斯议,且可繼續(xù)開始新的編輯产捞。
2.2從帶分隔符的文本文件導(dǎo)入數(shù)據(jù)
格式:mydataframe<-read.table(file,header=logical_value,sep="delimiter",row.names="name")
grade<-read.table("studentgrades.csv",header=TRUE,sep=",",row.names="studentID")
2.3導(dǎo)入excel數(shù)據(jù)
導(dǎo)入數(shù)據(jù)之前,需要安裝RODBC和xlsx包哼御。
Install.packages(“RODBC”)
Library(RODBC)
Channel<-odbcConnectExcel(“myfile.xls”)
Mydataframe<-sqlfetch(channel,”mysheet”)
odbcClose(channel)
以是是針對(duì)后綴為.xls的表格坯临,如果xlsx表面要再安裝xlsx包。
Install.packages(“xlsx”)
Library(xlsx)
Workbook<-“c:/myworkbook.xlsx” #賦予導(dǎo)入表格的路徑
Mydtaframe<-read.xlsx(workbook,1) #按照路徑導(dǎo)入第一個(gè)工作表恋昼,并將其按數(shù)據(jù)框存儲(chǔ)
2.4導(dǎo)入XML數(shù)據(jù)
2.5從網(wǎng)頁抓取數(shù)據(jù)
2.6導(dǎo)入SPSS數(shù)據(jù)
install.packages("Hmisc")
library(Hmisc)
mydataframe<-spss.get("mydata.sav",use.value.labels=TRUE)
2.7導(dǎo)入SAS數(shù)據(jù)
2.8導(dǎo)入Stata數(shù)據(jù)
Library(foreign)
Mydataframe<-read.dta(ydata.dta)
mydata.dta是Stata數(shù)據(jù)集看靠,mydataframe是返回的R數(shù)據(jù)框。
2.9導(dǎo)入netCDF數(shù)據(jù)
library(ncdf)
nc<-nc_open("mynetCDFfile")
myarray<-get.var.ncdf(nc,myvar)
2.10導(dǎo)入HDF5數(shù)據(jù)
2.11訪問數(shù)據(jù)庫管理系統(tǒng)液肌,
2.11.1R安裝ODBC包訪問ODBC驅(qū)動(dòng)的數(shù)據(jù)庫挟炬。
這樣就必須首先針對(duì)電腦系統(tǒng)和數(shù)據(jù)庫類型安裝和配置合適的ODBC驅(qū)動(dòng),然后安裝RODBC包。
install.packages("RODBC")
library(RODBC)
myconn<-odbcConnect("mydsn",uid="Rob",pwd=aardvark)
crimedat<-sqlFetch(myconn,Crime)
#將數(shù)據(jù)庫中的表Crime導(dǎo)入數(shù)據(jù)框crimedat
pundat<-sqlQuery(myconn,"select*from Punishment")#將數(shù)據(jù)庫中的表Punishment導(dǎo)入數(shù)據(jù)框pundat
close(myconn)
2.11.2 DBI相關(guān)包這個(gè)包為訪問數(shù)據(jù)庫提供了一個(gè)通用且一致的客戶端接口谤祖。構(gòu)建于這個(gè)框架上的RJDBC包提供了通過JDBC驅(qū)動(dòng)訪問數(shù)據(jù)庫的方案婿滓,所以必須安裝JDBC驅(qū)動(dòng)。其余基于DBI包還有RMySQL,ROracle,RPostgreSQL,RSQLite.
2.12通過Stat/Transfer導(dǎo)入數(shù)據(jù)
關(guān)于導(dǎo)入數(shù)據(jù)的途徑粥喜,有詳有略空幻,本人認(rèn)為需要在大量實(shí)踐中去體會(huì)其中的奧秘。
綜上所述容客,這兩章讓初學(xué)者對(duì)R語言有了整體的概念秕铛,首先它的流程是怎樣,然后細(xì)化到數(shù)據(jù)結(jié)構(gòu)的種類及如何按各自類型被賦值給一個(gè)對(duì)象缩挑,后面談到了導(dǎo)入數(shù)據(jù)的途徑但两,學(xué)好了這些,對(duì)今后開始真正的數(shù)據(jù)分析會(huì)有很大的幫助供置。