初涉R語言這本書,看了前兩章,有了如下總結。
1.首先是R語言數據分析的流程,如下圖。
總結:R語言運行進行數據分析的流程:數據首先導入,然后對數據進行整理,擬合一個模型,然后進行評估及交叉驗證,開始正式預測效果,最終生成報告。
2R程序中,數據的類型包括向量、矩陣、數據框、列表。數據框與數據集類似,列表就是各種對象的集合。使用<-進行賦值。R中多數功能是由程序內置函數和用戶自編函數提供的,一次交互式會話期間的所有數據對象都被保存在內存中。R語言也可以如C語言等一樣可以寫注釋,需要在語句后加上#。一些基本函數是默認直接可用的,其他高級函數則包含在按需加載的程序包中。
3R語言也有大量幫助功能,內置幫助系統提供了安裝包中所有函數的細節、參考文獻與使用示例。Help.start()會打開瀏覽器窗口。Rsitesearch()可在在線幫助手冊和R-Help郵件列表討論存檔中搜索指定主題。Vignette()返回的文檔一般是PDF格式的文章。
4.工作空間就是R語言的工作環境,儲存著用戶定義的對象。當前的工作目錄是R用來讀取文件和保存結果的默認目錄。
函數getwd()是查看當前目錄,setwd()是設置當前目錄。如果要調用不在當前目錄的文件,需要標明目錄。
setwd("D:/數據分析/project")
options()
options(digits=3)#顯示小后三位有效數字的格式
x<- runif(20) #包含20均勻分布隨面變量的向量
summary(X) #生成數據的摘要統計量
hist(x) #計算數據的直方差
savehistory()#將歷史文件保存到文件.rhistory中
save.image()#將歷史數據保存到文件R.data中
q()#結束,退出程序
5編好了代碼的腳本最終需要輸入與輸出,source()函數會在當前會話中執行腳本。Sink()將輸出重定向到指定的文件中,也可以用如下函數重定向圖形輸出。最后dev.off()將輸出返回到終端。
整個流程是這樣的:
6. R語言中用戶貢獻了許多模塊包,其他用戶可以自行下載使用。使用函數install.packages()調用,使用library()載入包,libPaths()顯示包的位置。Search()可以知道哪些包已加載并使用。
講完了第一章R語言的總體概念,就需要從最初的數據導入開始,最早涉及就是數據結構的分類,然后依照不同渠道將數據導入。所以有了第二章。
1.數據結構包括標量、向量、矩陣、數組、數據框和列表。
數據框是R中用于存儲數據的一種結構,可以存儲不同類型包括數值型、字符型的變量。因子是名義型變量或有序型變量。它在R中被特殊存儲和處理。
1.1向量:是用于存儲數值型、字符型或邏輯型數據的一維數組。C()創建向量,方括號訪問向量里面的值。
> 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 .矩陣
矩陣是個二維數組。公式:
Myymatrix<-matix(vector,nrow=number_of_rows,ncol=number_of_columns,byrow=logical_value,dimnames=list(char_vector_rowname,char_vector,colnames))vector是指矩陣元素,nrow是指矩陣行數,ncol是指矩陣列數,byrow是分配數據按行或列排列,默認是列,dimnames是指定行和列的名稱。
創建矩陣:
> y<-matrix(1:25,nrow=5,ncol=5) #創建一個5X5的矩陣
> y
[,1] [,2] [,3] [,4] [,5]
[1,]16111621
[2,]27121722
[3,]38131823
[4,]49141924
[5,]510152025
> cells<-c(2,6,89,56) #創建一個2X2的矩陣
>rname<-c("a1","a2")
>cname<-c("b1","b2")
> mymatrix1<-matrix(cells,nrow=2,ncol=2,byrow=FALSE,dimnames=list(rname,cname))
#數值按列填充,默認是列填充
> mymatrix1
b1 b2
a12 89
a26 56
>
mymatrix2<-matrix(cells,nrow=2,ncol=2,byrow=TRUE,dimnames=list(rname,cname))
#數值按行填充
> mymatrix2
b1 b2
a126
a2 89 56
矩陣下標的使用
> 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數組
數組格式:myarray<-array(vector,dimensions,dimnames)
Array代表是一個數組,dimension是維度標簽列表,是可選項,系統可自動列出名稱
>dim1<-c("a1","a2")#標識維度名稱標簽,此處是一維
>
dim2<-c("b1","b2","b3") #標識維度名稱標簽,此處是二維
>
dim3<-c("c1","c2","c3","c4") #標識維度名稱標簽,此處是三維
>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數據框
此數據類型為多種模式,可以是數字型,也可以是字符串型,還有其它,但同一組數據類型需要一致。數據框可有函數data.frame構建。
格式data<-data.frame(col1,col2,col3)
> patientID<-c(1,2,3,4) #數值型
> age<-c(22,45,67,89)#數值型
>
diabetes<-c("Type1","Type2","Type1","Type2")
#字符串型
> status
#字符串型
>
patientdata<-data.frame(patientID,age,diabetes,status) #組建數據框
> patientdata
patientID age diabetesstatus
1122Type1Poor
2245Type2Improved
3367Type1 Excellent
4489Type2Poor
選取數據框中的數據
> 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
另外此函數可生成兩個變量的聯表table(patientdata$diabetes,patientdata$status)
table(patientdata$diabetes,patientdata$status),這里理解類似于excel里的pivot.
Excellent Improved Poor
Type1101
Type2011
Ps:Attach(),detach(),with()可以簡化代碼,不用重復鍵入數據框。但Attach(),detach()也有局限,如果新定義了一個同名稱的變量,雖是同名,但變量數據不一時,則就不能調出新定義的數據框,它僅對原始定義數據框有效。
> attach(mtcars) #此函數可以數據框添加到R的搜索路徑中,當遇到一個變量后,將檢查搜索徑中的數據框,以定位到這個變量。
> summary(mpg)
Min. 1st Qu.MedianMean 3rd Qu.Max.
10.4015.4219.2020.0922.8033.90
> plot(mpg,disp)
1.5因子
類別變量和有序類別變量在R中稱為因子。函數factor()以一個整數向量的形式存儲類別值,整數的取值范圍是[1,K].
譬如在糖尿病事例中,將status各種情況設置向量編碼,type設置為向量編碼。相當于原本以字符串形式出現的數據將其統一賦值設置為整型數字向量。如果表示有序型變量,需要指定參數ordered=true.
> patientID<-c(1,2,3,4) #以向量形式輸入數據
> 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) #將因子型變量用數據框表現出來
> str(patientdata) #顯示統計概要
'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列表
列表就是一些對象的有序集合。列表里有若干不同數據類型的數據,列表是將它們整合到單個對象名下。用函數list創建列表。結構是mylist<-(object1,object2)
> a<-c("采購訂單明細") #字符串形式
> b<-c("訂單A","訂單B","訂單C","訂單D")
> page<-c(1,10,20,50)#數字形式
> e<-c(10,34,56,78)
> cname<-c("訂單A","訂單B")
> rname<-c("單價","總價")
>
d<-matrix(e,nrow=2,ncol=2,dimnames=list(rname,cname)) #矩陣數據結構
>
mylist<-list(title=a,name=b,pages=page,d) #列表結構
> mylist
$title
[1] "采購訂單明細"
$name
[1] "訂單A" "訂單B" "訂單C" "訂單D"
$pages
[1]1 10 20 50
[[4]]
訂單A訂單B
單價1056
總價3478
> mylist["name"] #取出第二個對象的值
$name
[1] "訂單A" "訂單B" "訂單C" "訂單D"
> mylist[[2]]#格式與上一個不一樣,但取值內容一樣
[1] "訂單A" "訂單B" "訂單C" "訂單D"
了解了數據結構,就需要知道數據的來源,意即從何而為呢?開始了數據輸入。
2.數據的輸入,以下便是諸多的數據來源。
2.1使用鍵盤輸入數據:先建立一個空的數據表格,然后edit函數可幫助后面在表里錄入數據。
>mydata<-data.frame(age=numeric(0),gender=character(0),weight=numeric(0))
> mydata<-edit(mydata)
此表格關閉后,再次執行mydata<-edit(mydata),發現之前內容已保存,且可繼續開始新的編輯。
2.2從帶分隔符的文本文件導入數據
格式: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導入excel數據
導入數據之前,需要安裝RODBC和xlsx包。
Install.packages(“RODBC”)
Library(RODBC)
Channel<-odbcConnectExcel(“myfile.xls”)
Mydataframe<-sqlfetch(channel,”mysheet”)
odbcClose(channel)
以是是針對后綴為.xls的表格,如果xlsx表面要再安裝xlsx包。
Install.packages(“xlsx”)
Library(xlsx)
Workbook<-“c:/myworkbook.xlsx” #賦予導入表格的路徑
Mydtaframe<-read.xlsx(workbook,1) #按照路徑導入第一個工作表,并將其按數據框存儲
2.4導入XML數據
2.5從網頁抓取數據
2.6導入SPSS數據
install.packages("Hmisc")
library(Hmisc)
mydataframe<-spss.get("mydata.sav",use.value.labels=TRUE)
2.7導入SAS數據
2.8導入Stata數據
Library(foreign)
Mydataframe<-read.dta(ydata.dta)
mydata.dta是Stata數據集,mydataframe是返回的R數據框。
2.9導入netCDF數據
library(ncdf)
nc<-nc_open("mynetCDFfile")
myarray<-get.var.ncdf(nc,myvar)
2.10導入HDF5數據
2.11訪問數據庫管理系統,
2.11.1R安裝ODBC包訪問ODBC驅動的數據庫。
這樣就必須首先針對電腦系統和數據庫類型安裝和配置合適的ODBC驅動,然后安裝RODBC包。
install.packages("RODBC")
library(RODBC)
myconn<-odbcConnect("mydsn",uid="Rob",pwd=aardvark)
crimedat<-sqlFetch(myconn,Crime)
#將數據庫中的表Crime導入數據框crimedat
pundat<-sqlQuery(myconn,"select*from Punishment")#將數據庫中的表Punishment導入數據框pundat
close(myconn)
2.11.2 DBI相關包這個包為訪問數據庫提供了一個通用且一致的客戶端接口。構建于這個框架上的RJDBC包提供了通過JDBC驅動訪問數據庫的方案,所以必須安裝JDBC驅動。其余基于DBI包還有RMySQL,ROracle,RPostgreSQL,RSQLite.
2.12通過Stat/Transfer導入數據
關于導入數據的途徑,有詳有略,本人認為需要在大量實踐中去體會其中的奧秘。
綜上所述,這兩章讓初學者對R語言有了整體的概念,首先它的流程是怎樣,然后細化到數據結構的種類及如何按各自類型被賦值給一個對象,后面談到了導入數據的途徑,學好了這些,對今后開始真正的數據分析會有很大的幫助。