R语言数据的输入
一、使用键盘输入数据
也许输入数据最简单的方式就是使用键盘了。有两种常见的方式:用R内置的文本编辑器和直接在代码中嵌入数据。我们首先考虑文本编辑器。
R中的函数edit()会自动调用一个允许手动输入数据的文本编辑器。具体步骤如下:
(1)创建一个空数据框(或矩阵),其中变量名和变量的模式需与理想中的最终数据集一致;
(2)针对这个数据对象调用文本编辑器,输入你的数据,并将结果保存回此数据对象中。
在下例中,你将创建一个名为mydata的数据框,它含有三个变量: age (数值型)、 gender (字符型)和weight (数值型)。然后你将调用文本编辑器,键入数据,最后保存结果。
myderharr(am0),e(ic(0))
mydata <- edit(mydata)
类似于age=numeric(0)的赋值语句将创建一个指定模式但不含实际数据的变量。注意,编辑的结果需要赋值回对象本身。函数edit()事实上是在对象的一个副本上进行操作的。如果你 不将其赋值到一个目标,你的所有修改将会全部丢失!
在Windows 上调用函数edit() 的结果如下图所示。如下图所示,我已经自主添加了一些数据。单击列的标题,你就可以用编辑器修改变量名和变量类型(数值型、字符型)。你还可以通 过单击未使用列的标题来添加新的变量。编辑器关闭后,结果会保存到之前赋值的对象中(本例中为mydata)。 再次调用mydata <- edit(mydata), 就能够编辑已经输入的数据并添加新的数据。语句mydata <- edit(mydata)的一种简捷的等价写法是fix(mydata)。
此外,你可以直接在你的程序中嵌入数据集。比如说,参见以下代码:
mydatatxt<
age gender weight
25 m 166
30 f 115
18 f 120
mydata <- read.table(header=TRUE, text=mydatatxt)
以上代码创建了和之前用edit()函数所创建的一样的数据框。一个字符型变量被创建于存储原始数据,然后read.table()函数被用于处理字符串并返回数据框。
键盘输入数据的方式在你在处理小数据集的时候很有效。对于较大的数据集,你所期望的也许是我们接下来要介绍的方式:从现有的文本文件、 Excel电子表格、统计软件或数据库中导入数据。
二、从带分隔符的文本文件导入数据
你可以使用read.table()从带分隔符的文本文件中导入数据。此函数可读入一个表格格式的文件并将其保存为一个数据框。表格的每一行分别出现在文件中每一行。
其语法如下:
mydataframe <- read.table(file, options)
其中, file是一个带分隔符的ASCII文本文件, options 是控制如何处理数据的选项。下表列出了常见的选项。
此外,你可以直接在你的程序中嵌入数据集。比如说,参见以下代码:
mydatatxt<
age gender weight
25 m 166
30 f 115
18 f 120
mydata <- read.table(header=TRUE, text=mydatatxt)
以上代码创建了和之前用edit()函数所创建的一样的数据框。 一个字符型变量被创建于存储原始数据,然后read.table()函数被用于处理字符串并返回数据框。
键盘输入数据的方式在你在处理小数据集的时候很有效。对于较大的数据集,你所期望的也许是我们接下来要介绍的方式:从现有的文本文件、 Excel电子表格、统计软件或数据库中导入数据。
二、从带分隔符的文本文件导入数据
你可以使用read.table()从带分隔符的文本文件中导入数据。此函数可读入一个表格格式的文件并将其保存为一个数据框。表格的每一行分别出现在文件中每一行。其语法如下:
mydataframe <- read.table(file, options)
其中, file是一个带分隔符的ASCII文本文件, options是控制如何处理数据的选项。下表列出了常见的选项。
此外,你可以直接在你的程序中嵌入数据集。比如说,参见以下代码:
mydatatxt<
age gender weight
25 m 166
30 f 115
18 f 120
mydata <- read.table(header=TRUE, text=mydatatxt)
以上代码创建了和之前用edit()函数所创建的一样的数据框。 一个字符型变量被创建于存储原始数据,然后read.table()函数被用于处理字符串并返回数据框。
键盘输入数据的方式在你在处理小数据集的时候很有效。对于较大的数据集,你所期望的也许是我们接下来要介绍的方式:从现有的文本文件、 Excel电子表格、统计软件或数据库中导入数据。
三、导入Excel数据
读取一个Excel文件的最好方式,就是在Excel中将其导出为一个逗号分隔文件(csv), 并使用前文描述的方式将其导入R中。此外,你可以用x1sx包直接地导入Excel工作表。请确保在第 一次使用它之前先进行下载和安装。你也需要x1sxjars 和rJava 包,以及一个正常工作的Java 安装 (http:/java.com)。
x₁ sx包可以用来对Excel 97/2000/XP/2003/2007文件进行读取、写入和格式转换。函数read.xlsx() 导入一个工作表到一个数据框中。最简单的格式是read.xlsx(file,n), 其中file是Excel工作簿的所在路径, n则为要导入的工作表序号。举例说明,在Windows上,以下代码:
library(xlsx)
workbook <-"c:/myworkbook.xlsx"
mydataframe <- read.xlsx(workbook,1)
从位于C盘根目录的工作簿myworkbook.xlsx中导入了第一个工作表,并将其保存为一个数据框 mydataframe函数read.xlsx() 有些选项可以允许你指定工作表中特定的行 (rowIndex)和列 (colIndex), 配合上对应每一列的类 (colClasses)。 对于大型的工作簿(比如说,100000+ 个单元格),你也可以使用read.x1sx2() 函数。这个函数用Java来运行更加多的处理过程,因此 能够获得可观的质量提升。请查阅help(read.xlsx) 获得更多细节。
也有其他包可以帮助你处理Excel文件。替代的包包含了XLConnect 和openxlsx包;
XLConnect依赖于Java, 不过openxlsx并不是。所有这些软件包都可以做比导入数据更加多的事情它们也可以创建和操作Excel文件。那些需要创建R和Excel之间的接口的程序员应该要 仔细查看这些软件包中的一个或多个。
四、导入XML数据
以XML格式编码的数据正在逐渐增多。R中有若干用于处理XML文件的包。例如,由Duncan Temple Lang编写的XML包允许你读取、写入和操作XML文件。XML格式本身已经超出了本书的 范围。对使用R存取XML文档感兴趣的读者可以参www.omegahat.org/RSXML,从中可以找到 若干份优秀的软件包文档。
五、从网页抓取数据
网络上的数据,可以通过所谓Web数据抓取(Webscraping)的过程,或对应用程序接口(application programming interface,API)的使用来获得。一般地说,在Web数据抓取过程中,用户从互联网上提取嵌入在网页中的信息,并将其保存 为R中的数据结构以做进一步的分析。比如说, 一个网页上的文字可以使用函数readLines()来 下载到一个R的字符向量中,然后使用如grep()和gsub()一类的函数处理它。对于结构复杂的 网页,可以使用RCurl包和XML 包来提取其中想要的信息。
API指定了软件组件如何互相进行交互。有很多R包使用这个方法来从网上资源中获取数据。 这些资源包括了生物、医药、地球科学、物理科学、经济学,以及商业、金融、文学、销售、新 闻和运动等的数据源。
比如说,如果你对社交媒体感兴趣,可以用twitteR来获取Twitter数据,用 Rfacebook来 获取Facebook数据,用Rflickr来获取Flicker数据。其他软件包允许你连接上如Google、Amazon、 Dropbox、Salesforce等所提供的广受欢迎的网上服务。
可以查看CRAN Task View中的子版块Web Technologies and Services(https://cran.rproject.org/web/views/WebTechnologies.html)来获得一个 全面的列表,此列表列出了能帮助你获取网上资源的各种R包。
六、导入SPSS数据
IBMSPSS 数据集可以通过foreign包中的函数read.spss()导入到R中,也可以使用Hmisc 包中的spss.get()函数。函数spss.get()是对read.spss()的一个封装,它可以为你自动设置后者的许多参数,让整个转换过程更加简单一致,最后得到数据分析人员所期望的结果。
首先,下载并安装Hmisc包 (foreign 包已被默认安装):install.packages("Hmisc")
然后使用以下代码导入数据:
library(Hmisc)
mydataframe <- spss.get("mydata.sav", use.value.labels=TRUE)
这段代码中, mydata.sav是要导入的SPSS数据文件, use.value.labels=TRUE表示让函数 将带有值标签的变量导入为R中水平对应相同的因子, mydataframe是导入后的R数据框。
七、导入SAS数据
R中设计了若干用来导入SAS数据集的函数,包括foreign包中的read.ssd(),Hmisc包中的sas.get(), 以及sas7bdat包中的read.sas7bdat()。 如果你安装了SAS,sas.get()是一个好的选择。
比如说,你想导入一个名为clients.sas7bdat的SAS 数据集文件,它位于一台Windows机器上的 C:/mydata文件夹中,以下代码导入了数据,并且保存为一个R数据框:
library(Hmisc)
datadir <-"C:/mydata"
sasexe <-"C:/Program Files/SASHome/SASFoundation/9.4/sas.exe"
mydata <- sas.get(libraryName=datadir, member="clients", sasprog=sasexe)
libraryName 是一个包含了SAS数据集的文件夹, member是数据集名字(去除掉后缀名sas7bdat),sasprog是到SAS可运行程序的完整路径。有很多可用的选项;查看help(sas.get) 获得更多细节。
下面是一个示例:
SAS程序:
libname datadir "C:\mydata";
proc export data=datadir.clients
outfile="clients.csv"
dbms=csv;
run;
R程序:
mydata <- read.table("clients.csv", header=TRUE, sep=",")
前面两种方法要求你安装了一套完整的可运行的SAS 程序。如果你没有连接SAS的途径,函数read.sas7dbat() 也许是一个好的候选项。这个函数可以直接读取sas7dbat格式的SAS 数据集。
这个例子的对应代码是:
library(sas7bdat)
mydata <- read.sas7bdat("C:/mydata/clients.sas7bdat")
不像sas.get(),read.sas7dbat()忽略了SAS用户自定义格式。此外,这个函数用了明显更多的时间来进行处理。尽管我使用这个包的时候比较好运,它依然应该被认为是实验性质的。
最后, 一款名为Stat/Transfer的商业软件可以完好地将SAS数据集(包括 任何已知的变量格式)保存为R数据框。与read.sas7dbat()一样,它也不要求安装SAS。
八、 导入Stata数据
要将Stata数据导入R中非常简单直接。所需代码类似于:
library(foreign)
mydataframe <- read.dta("mydata.dta")
这里,mydata.dta是Stata数据集,mydataframe是返回的R数据框。
九、导入NetCDF数据
Unidata项目主导的开源软件库NetCDF(Network Common Data Form,网络通用数据格式) 定义了一种机器无关的数据格式,可用于创建和分发面向数组的科学数据。 NetCDF格式通常用 来存储地球物理数据。ncdf包和ncdf4包为NetCDF文件提供了高层的R接口。
ncdf包为通过Unidata的NetCDF库(版本3或更早)创建的数据文件提供了支持,而且在 Windows、Mac OS X和Linux上均可使用。 ncdf4包支持NetCDF 4或更早的版本,但在Windows上尚不可用。
考虑如下代码:
library(ncdf)
nc <- nc open("mynetCDFfile")
myarray <- get.var.ncdf(nc, myvar)
在本例中,对于包含在NetCDF文件mynetCDFfile中的变量myvar, 其所有数据都被读取并保 存到了一个名为myarray的R数组中。
值得注意的是,ncdf包和ncdf4包最近进行了重大升级,使用方式可能与旧版本不同。另外, 这两个包中的函数名称也不同。请阅读在线帮助以了解详情。
十、导入HDF5数据
HDF5(Hierarchical Data Format,分层数据格式)是一套用于管理超大型和结构极端复杂数 据集的软件技术方案。 rhdf5包为R提供了一个HDF5 的接口。这个包在Bioconductor网站上而不是CRAN 上提供。
十一、访问数据库管理系统
R中有多种面向关系型数据库管理系统( DBMS) 的接口,包括Microsoft SQL Server、Microsoft Access、MySQL、Oracle、PostgreSQL、DB2、Sybase、Teradata以及SQLite。其中一些包通过原 生的数据库驱动来提供访问功能,另一些则是通过ODBC 或JDBC 来实现访问的。使用R来访问存 储在外部数据库中的数据是一种分析大数据集的有效手段(参见附录F), 并且能够发挥SQL和R各自的优势。
1.ODBC接口
在R中通过RODBC包访问一个数据库也许是最流行的方式,这种方式允许R连接到任意一种拥有ODBC驱动的数据库,这包含了前文所列的所有数据库。
第一步是针对你的系统和数据库类型安装和配置合适的ODBC驱动——它们并不是R的一部分。如果你的机器尚未安装必要的驱动,上网搜索一下应该就可以找到。针对选择的数据库安装并配置好驱动后,请安装RODBC包。你可以使用命令 install.packages("RODBC")来安装它。 RODBC包中的主要函数列于下表中。
RODBC包允许R和一个通过ODBC连接的SQL数据库之间进行双向通信。这就意味着你不仅可以读取数据库中的数据到R中,同时也可以使用R修改数据库中的内容。假设你想将某个数据库中的两个表 (Crime 和Punishment)分别导入为R中的两个名为crimedat 和pundat 的数据框,可以通过如下代码完成这个任务:
library(RODBC)
myconn <-odbcConnect("mydsn",uid="Rob", pwd="aardvark")
crimedat <- sqlFetch(myconn,Crime)
pundat <- sqlQuery(myconn,"select * from Punishment")
close(myconn)
这里首先载入了RODBC包,并通过一个已注册的数据源名称(mydsn)和用户名 (rob) 以及密码(aardvark) 打开了一个ODBC数据库连接。连接字符串被传递给sqlFetch(), 它将Crime表复制到R数据框crimedat中。然后我们对Punishment表执行了SQL 语句select 并将结果 保存到数据框pundat中。最后,我们关闭了连接。
函数sq1Query() 非常强大,因为其中可以插入任意的有效SQL语句。这种灵活性赋予了你选择指定变量、对数据取子集、创建新变量,以及重编码和重命名现有变量的能力。
2.DBI相关包
DBI包为访问数据库提供了一个通用且一致的客户端接口。构建于这个框架之上的RJDBC包提供了通过JDBC驱动访问数据库的方案。使用时请确保安装了针对你的系统和数据库的必要JDBC驱动。其他有用的、基于DBI的包有RMySQL、ROracle、RPostgreSQL 和RSQLite。 这些包都为对应的数据库提供了原生的数据库驱动,但可能不是在所有系统上都可用。详情请参阅 CRAN(http://cran.r-project.org)上的相应文档。
十二、通过 Stat/Transfer导入数据
在我们结束数据导入的讨论之前,值得提到一款能让上述任务的难度显著降低的商业软件。 Stat/Transfer(www.stattransfer.com)是一款可在34种数据格式之间作转换的独立应用程序,其中包括R中的数据格式(见下图)。
此软件拥有Windows、Mac和Unix版本,并且支持我们目前讨论过的各种统计软件的最新版本,也可通过ODBC访问如Oracle、Sybase、Informix和DB/2一类的数据库管理系统。