作为一种流行的数据科学编程语言,R 需要处理来自各种数据源的数据,如何将不同数据源中具有不同格式的数据导入到 R 中,并且转换为 R 能够处理的格式,是我们开始正式工作前的首要任务(如何获取数据是一个更大更复杂的问题,暂且不论),而如果 R 不是工作流程的最后一步,我们可能还需要将处理好的数据输出为各种格式。下面简单介绍 R 中一些常用的数据输入输出方式,而如果想要了解更详细的关于数据输入输出的内容,可以参阅 R 官方文档的HTML版本或者PDF版本。
R 可以从多种不同数据源导入数据,例如各种文本格式或者二进制格式的文件,Web 服务或者网页抓取,各种数据库管理系统,其他统计软件,或者是从键盘输入数据。下面介绍几种 R 中常用的数据输入方法:
最简单的方法就是使用键盘输入数据,当数据量很小时,用键盘手动输入数据也是可行的,这主要有两种方法:使用文本编辑器手动输入数据以及直接在代码中嵌入数据。
使用文本编辑器输入数据的流程是:创建一个指定格式的空数据结构,再调用
edit()
函数编辑具体的数据,并重新赋值给该数据结构。例如:
# 使用numeric(),character()和logical()函数来创建指定数据类型的空值
mydata <- data.frame(age=numeric(0), gender=character(0),
weight=numeric(0), marriage=logical(0))
mydata <- edit(mydata)
上述代码会打开一个如下图所示的窗口,以供从键盘手动输入数据:
另一种更简洁的等价写法是使用fix()函数:
fix(mydata)
对于较小的数据集,可以直接创建一个变量来从键盘输入数据,再利用输入数据的函数来读取,例如从键盘输入一个简易的表格型数据集:
mydatatxt <- "age gender weight marriage
25 m 70 F
30 f 58 T
18 f 50 F"
mydata <- read.table(header=T, text = mydatatxt)
mydata
.csv 文件指的是带有分隔符的文本文件(Comma-Separated
Values),可以通过read.table()函数或者read.csv()函数来读取,两者的区别仅仅在于参数默认取值,read.table()函数适用于导入各种表格型数据,而read.csv()函数的默认参数设置针对
.csv
文件,两者都会返回一个数据框。类似的函数还有read.csv2()和read.delim()等等,见read.table()函数的帮助文档。
read.table()函数的可选参数很多,详情参考帮助文档,这里列出几个常用的重要参数:
file:待导入的文件路径;
header:逻辑值参数,表示文件内第一行是否为变量名;
sep:指定分隔符,默认为sep=" ",表示一个或多个空格、制表符、换行或者回车;
na.strings:接受一个向量,表示将哪些值转换为缺失值
NA;
colClasses:接受一个指定各列类型的的向量,可以显著提升处理速度;
skip:指定跳过多少行数据,可以用来跳过一些文件自带的注释说明;
stringAsFactors:逻辑值参数,指定是否将所有字符变量转换成因子,默认取FALSE;
text:仅当file参数缺失时使用,接收一个字符串作为输入(上面的代码就是一个例子)。
除了直接导入,R 中还有一系列函数支持通过连接导入数据,详情参见
file()函数的帮助文档。
以上方法均为 base R 自带,实际上,还有一个功能强大的 R
包readr可以读取 .csv
文件,它是tidyverse的核心包之一,详情参考read_delim()函数的帮助文档。readr的一系列数据导入函数在处理速度上有巨大的优势,因此在处理大量数据时应当予以考虑,此外这些函数还能自行推测每一列的数据类型。另外,作为tidyverse生态系统的一部分,这些函数的返回值是
tibble 数据框。
从 Microsoft Excel 导入数据时,可以在 Excel 内先将数据导出为 .csv
文件,再用上述方式导入 R
中,或者使用readxl包中的read_excel()函数(当明确文件类型是
.xls 还是 .xlsx
时,直接使用read_xls()函数或read_xlsx()函数)。
此外,还有其他包可以用来导入 Excel
数据,例如xlsx,XLConnect和openxlsx,其中xlsx和XLConnect需要依赖
Java。
在 RStudio 中,从 Excel 或者文本格式导入数据的操作,可以通过点击
haven包提供了从其他统计软件导入数据的函数:
从 SPSS 导入:使用read.spss()函数;
从 SAS 导入:使用read_sas()函数;
从 Stata 导入:使用read_dta()函数。
从网页获取数据主要有两种方式,一种是通过 Web API,一种是通过网页抓取(Web Scraping)。
可以参考CRAN上的 Web Technologies and Services 任务列表,其中列出了各种从网络获取数据资源的 R 包,例如常见的社交网站 Twitter,Facebook,Instagram,LinkedIn 等等。
比如使用readLines()函数从网页获取文本,再使用grep(),gsub()等函数处理字符串。R
包rvest提供了一些可以简化网页抓取的函数(参考了 Python
库beautifulsoup4),是一个流行的网页抓取包,此外还有RCurl和XML包等等。更多关于用
R 进行网页抓取的内容可以参考这篇博客。
可以使用jsonlite,rjson,tidyjson等包。
在 R 中访问一个数据库最常见的方式就是通过开放数据库连接(Open
Database Connectivity,
ODBC),这需要在计算机上先安装与自己系统和数据库相应的 ODBC
驱动,然后安装并且使用RODBC包。在 RStudio
中,点击右上角的窗口中的”Connections”按钮,就可以通过调用odbc包来访问数据库,如下图所示。
除了 ODBC 外,还可以基于数据库接口(Database Interface,
DBI) 访问数据库,例如通过Java数据库连接(Java Database
Connectivity,
JDBC),这需要在计算机上先安装与自己系统和数据库相应的 JDBC
驱动,然后安装并且使用RJDBC包。除了RJDBC包外,还有其他基于DBI的包,如RMySQL,ROracle,RPostgreSQL和RSQLite。
在RStudio 中,上述许多操作都可以通过点击右上角的窗口中的”Import Dataset”按钮来完成,如下图所示。RStudio 会自动生成相应的代码来导入文件。
Stat/Transfer 是一款功能强大的数据格式转换软件,可以完成前面的几乎所有格式转换和导入导出任务,唯一的缺点是,它不是免费的。
最后来简单介绍一下如何使用 R 输出数据,相比于输入数据,我们往往不是那么关心输出数据,下面主要介绍三种输出格式。
使用write.table()函数,或者使用write.csv()和write.csv2()函数,三者之间的关系类似read.table(),read.csv()和read.csv2()函数。
语法为:
write.table(x, file = "", quote = TRUE, sep= " ", na = "NA")
其中x是待导出的 R
对象,file接收输出文件的保存路径,逻辑值参数quote表示是否将字符串用引号括起来,默认取TRUE,sep表示分隔符,默认为" ",na指定用什么字符表示缺失值NA。这里只列出了基本的常用参数,更多可选参数见帮助文档。
xlsx包里的write.xlsx()函数可以将数据框导出到
Excel 2007
工作簿,或者可以使用writexl包中的write_xlsx()函数,openxlsx包也提供了解决方案,具体用法见帮助文档。
foreign包提供了write.foreign()函数,可以生成包含数据的任意格式的文本文件,并同时生成可读取该数据的目标软件的可执行代码文件,语法为:
write.foreign(df, datafile, codefile,
package = c("SPSS", "Stata", "SAS"), ...)
参数df为数据框,datafile指定文本文件的存储路径,codefile指定代码文件的存储路径,package指定导入的目标统计软件。