2.1数据读取
2.1.1读取内置数据集
R本身提供了超过50个数据集,同时在功能包(包括标准功能包)中附带了更多的数据集。R自身提供的数据集存放在自带的datasets程序包中。
通过指令data()可以列出基本系统提供的全部数据集(包括datasets以及通过!ibrary()加载的程序包中的数据集)。也可以载入特定的数据集:
> data()#查看数据集列表
> data(CO2)#载入C02数据集(来自datasets)
> library(MASS)#载入package MASS。
> data(package="MASS")#查看MASS中数据集
> data(SP500,package="MASS")#载入MASS中的SP500数据集,也可简化为data(SP500)
2.1.2读取文本文件
(1)文件目录操作
> getwd()#返回当前工作目录
[1] "c:/Program Files/RStudio"
> setwd("d:/data")#更改工作目录
(2)常用的读取指令read
R最常用的读取文本文件(ASCII)的指令是read.table()
read.table(file, header = FALSE, sep = "", quote = "\"'",dec = ".", numerals = c("allow.loss", "warn.loss", "no.loss"),row.names, col.names, as.is = !stringsAsFactors,na.strings = "NA", colClasses = NA, nrows = -1,skip = 0, check.names = TRUE, fill = !blank.lines.skip,strip.white = FALSE, blank.lines.skip = TRUE,comment.char = "#",allowEscapes = FALSE, flush = FALSE,stringsAsFactors=default.stringsAsFactors(),fileEncoding = "", encoding = "unknown", text, skipNul = FALSE)
> data=read.table("c:/Program Files/RStudio/1.txt",header=T)
与read.table用法类似的指令还包括read.csv和read.delim:
read.csv()用于读取逗号分隔文件,sep默认值为","
read.delim()针对使用其他分隔符的数据(并月不使用行号),sep默认值为"\t"
使用read.table或read.csv指令时,对数据格式的要求非常严格,数据必须是完整的,每一行数据的数量都一样。如果出现缺失值,用read.table读取时会报错,用read.csv读取时会自动在缺失位置填补NA
(3)灵活的读取指令scan()
scan(file = "", what = double(),nmax = -1, n = -1, sep = "",quote = if(identical(sep,"\n")) "" else "'\"", dec = ".",skip= 0, nlines = 0, na.strings = "NA",flush = FALSE, fill = FALSE,strip.white = FALSE,quiet = FALSE, blank.lines.skip = TRUE, multi.line = TRUE,comment.char= "", allowEscapes = FALSE,fileEncoding = "", encoding ="unknown", text, skipNul = FALSE)
> ?scan()
> data=scan("1.txt",skip=1,what=list(city="",price=0,salary=0))
Read 3 records
> data
$city
[1] "bj" "sh" "gz"
$price
[1] 1 3 5
$salary
[1] 2 4 6
> mode(data)#显示对象的类型
[1] "list"
> names(data) #显示对象中的标签
[1] "city" "price" "salary"
> dim(data)#显示对象的维数
NULL
要显示列表中的变量,需要使用符号$,但是当数据文件中有很多变量时,多次使用$会比较麻烦,这时用attach()指令,可以直接通过变量名称来获取变量中的信息。detach()可撤销操作。
> data$city
[1] "zhengzhou" "hefei" "taiyuan"
> attach(data)
> city
[1] "zhengzhou" "hefei" "taiyuan"
> detach(data)
> city
Error: object 'city' not found
2.1.3读取固定宽度格式的文件
有些数据文件格式非常规整,但没有分隔符,就需要我们在读取时手动划分每个字段的长度,这时需要用到的函数是:ead.fwf(),它以行的方式首先读入数据,通过widths参数指定一个向量,来设置各个字段的宽度,注意小数点也占一个字符。
> data.fwf=read.fwf("c:/Program Files/RStudio/2.txt",widths=c(2,4,4,3),col.names=c("w","x","y","z"))
Warning message:
In readLines(file, n = thisblock) :
incomplete final line found on 'c:/ProgramFiles/RStudio/2.txt'#注意:文本文档中最后一行的回车符很重要,这是一个类似于停止符的标识.否则读入时会显示“最后一行不完整”的警告,但也不影响数据读入的效果。
> data.fwf
w x y z
1 AA 2005 30.3 1.2
2 AB 2007 73.9 1.3
3 BB 2011 84.2 1.4
4 BC 2010 83.3 1.5
5 CC 2009 81.6 1.6
2.1.4读取Excel数据
在R中打开Excel表格数据有多种方式,最简单的一种是从剪贴板中读取数据。首先打开Excel表格,选中需要的数据后复制(按快捷键Ctrl+C ),这时我们需要的数据就被存放在剪贴板了。
> data.excel=read.delim("clipboard")
> mode(data.excel);dim(data.excel)
[1] "list"
[1] 3 3
RODBC提供了R和各类数据库的一个接口,通过它可以实现R和Access, Excel, dBase和SQL Server等多种软件的连接。其中获取Excel连接的函数是odbcConnectExcel()和odbcConnectExce12007(),分别用来读取Excel2003版(扩一展名为.xls)和2007版(xlsx)数据。读入Excel数据的具体步骤如下:
> library(RODBC)
> channel=odbcConnectExcel2007("C:/Program Files/RStudio/3.xlsx")#列出Exce工中的表格
> sqlTables(channel)#获取Excel连接
TABLE_CAT TABLE_SCHEM TABLE_NAME
1 C:\\Program Files\\RStudio\\3.xlsx <NA> Sheet1$
2 C:\\Program Files\\RStudio\\3.xlsx <NA> Sheet2$
3 C:\\Program Files\\RStudio\\3.xlsx <NA> Sheet3$
TABLE_TYPE REMARKS
1 SYSTEM TABLE <NA>
2 SYSTEM TABLE <NA>
3 SYSTEM TABLE <NA>
获取Sheet1中的数据,可以使用如下任意一种方式。sqlFetch()直接读取Excel连接中的一个表到R数据框或列表中,sqlQueryQ在Excel连接上执行SQL查询语句,井返回结果。
> data.excel2=sqlFetch(channel,"Sheet1")
> data.excel2=sqlQuery(channel,"select*from[sheet1$")
> close(channel)#关闭ODBC连接,释放空间
> mode(data.excel2);dim(data.excel2)
[1] "character"
NULL
2.1.5读取数据库文件
(1)通过RODBC读取数据库
> odbcDataSources()#查看可用的数据源
MS Access Database
"Microsoft Access Driver (*.mdb, *.accdb)"
Excel Files
"Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)"
dBASE Files
"Microsoft Access dBASE Driver (*.dbf, *.ndx, *.mdx)"
程序包RODBC中最基础的函数为odbcConnect(),其可以直接返回一个ODBC连接, 获取Access连接的函数分别为:
> odbcConnectAccess(access.file,uid="",pwd="",...)
> odbcConnectAccess2007(access.file,uid="",pwd="",...)
RODBC中与SQL相关的函数
(2)通过RMySQL/DBI读取数据库
(3)通过RJDBC读取数据库
2.1.6读取网页数据
R中的程序包XML为读写XML文档提供了通用的工具。
readHTMLTable(doc,header=NA,colClasses=NULL,skip.rows=integer(),trim=TRUE,e1Fun=xmlValue,as_data.frame=TRUE,which=integer(),…)
> library(XML)
> baseURL="http://data.eastmoney.com/center/stock.html"
> table=readHTMLTable(baseURL,header=TRUE,which=1)
> mode(table);dim(table)
[1] "list"
[1] 4 7
> table#变量名有中文,结果有乱码,需要对表格中的变量名重新赋值。
> table
类别成交量(万股) 成交金额(亿元) 总市值(亿元) 流通市值(亿元) 上市公司(家) 平均市盈率
1 沪市 5218143.76 7944.93 345447.28 307408.81 1041 21.06
2 深市 - - - - - -
3 中小板 - - - - - -
4 创业板 - - - - - -
> names(table)=c("类别","成交量(万股)","成交金额(亿元)","总市值(亿元)","流通市值(亿元)","上市公司(家)","平均市盈率")
> table$类别=c("沪市","深市","中小板","创业板" )
2.1.7读入R格式的文件
R的数据或更一般的对象(如向量、矩阵、数据框、列表甚至函数等)可以通过save()保存为R专有的文件格式,以Rdata为后缀。要读取这类文件,需要用到函数load()来加载。
2.1.8从其他统计软件读入数据
程序包foreign的主要函数
> library(foreign)
> data.spss=read.spss("C:/Program Files/RStudio/参数检验(各保险公司人员构成情况(1999年)).sav",to.data.frame=T)
> dim(data.spss)
[1] 26 15
对于SPSS数据的读取,还可以使用程序包Hmisc中的函数spss.get(),它可以导入更多的附加信息,例如变量的标签(label )
> library(Hmisc)
> data.spss2=spss.get("C:/Program Files/RStudio/参数检验(各保险公司人员构成情况(1999年)).sav")
(2)读取SAS数据
2.2数据保存
2.2.1使用函数cat()
cat(... , file = "", sep = " ", fill = FALSE, labels = NULL,append = FALSE)
其中的参数file表示要输出的文件名,当参数append=TRUE时,在指定文件的末尾添加内容。
cat()可以连接多个字符串,也可以连接字符串和数值向量等不同类型的对象。
> cat(c("abAB","c"),c("e","f"),"n",sep="")
abABcefn
> i=1:5
> cat("i=",i,"n",sep=",")#以逗号为分隔符
i=,1,2,3,4,5,n
这里更重要的功能是向一个指定的文件写入数据,例如要向cat.txt中存储数据,参数file指定被写入的文件,如果指定的文件已经存在则原来内容将被覆盖。若不想被覆盖,则要设置append=TRUE,表示追加内容。使用readLines()函数可以直接从连接中以行的形式读取文本。
> cat(c("ab","c"),file="C:/Program Files/RStudio/2.txt",sep="",append=TRUE)
> read.table("C:/Program Files/RStudio/2.txt")
V1
1 AA200530.31.2
2 AB200773.91.3
3 BB201184.21.4
4 BC201083.31.5
5 CC200981.61.6
6 abc
要用cat()多次写入时,也可以通过file事先打开一个连接,以简化代码。
> a=file("C:/Program Files/RStudio/2.txt")
2.2.2保存为文本文件
通常我们会把R中的向量、矩阵、数据框和列表等对象写入一个文本文件中并保存起来,例如扩展名为.txt的文件,因为一般文本文档可以被各种软件读取,具有很强的普适性。最常见的工作是把一个知阵或数据框以数字的矩形网格方式写入文件中,而且还可能保留行列的标签。这可以通过函数write.table和write来完成。
函数write仅可以写出一个矩阵或向量的特定列(和对一个矩阵进行转置)。
函数write.table()则更为便利,它可把一个数据框或列表等对象以包含行列标签的方式写出。
函数write.table()的调用格式如下所示:
write.table(x, file = "", append= FALSE, quote = TRUE, sep = " ",eol = "\n", na ="NA", dec = ".", row.names = TRUE,col.names = TRUE, qmethod= c("escape", "double"),fileEncoding = "")
其中,x表示要写入的对象,最好是矩阵或数据框;quote是逻辑值,TRUE表示变量名等字符、因子要用双引号括起来:sep指定分隔符;row.names/col.names也是逻辑值,TRUE表示将行名/列名写入文件中。
> data=read.table(a,header=T)
> write.table(data,file="C:/Program Files/RStudio/11.txt",col.names=T,quote=F)
> data=read.table("C:/Program Files/RStudio/11.txt",header=T)
> data
AA200530.31.2
1 AB200773.91.3
2 BB201184.21.4
3 BC201083.31.5
4 CC200981.61.6
5 abc
还可以使用write.csv()将数据框保存成逗号分隔文件,方法与上面一样,但是不包含列名,即col.names = NA。将row.names设置为FALSE,否则存入文件时会把行名1,2,3,...也写入。这样当再次读入csv文件时,得到的数据框与data一样。
> write.csv(data,file="C:/Program Files/RStudio/11.csv",col.names=F,quote=F)
> data.csv=read.csv("C:/Program Files/RStudio/1.csv")
> dim(data.csv)
[1] 5 2
2.2.3保存R格式文件
> save(data,file="C:/Program Files/RStudio/11.Rdata")
> load("C:/Program Files/RStudio/11.Rdata")
2.2.4保存为其他类型文件
程序包foreign除了有用于读取其他统计软件的文件的函数外,还有用于存储的函数。主要的函数是write. foreign(),目前支持导出到SPSS, Stata和SAS 。write.foreign(df, datafile, codefile, package=c("SPSS","Stata","SAS"),…)
df是一个数据框,datafile是输出数据的文件名称,codefile是用于代码输出的文件名称等。