初涉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语言有了整体的概念,首先它的流程是怎样,然后细化到数据结构的种类及如何按各自类型被赋值给一个对象,后面谈到了导入数据的途径,学好了这些,对今后开始真正的数据分析会有很大的帮助。