作为一种流行的数据科学编程语言,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 文件导入数据

.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 数据框。

导入 Excel 数据

从 Microsoft Excel 导入数据时,可以在 Excel 内先将数据导出为 .csv 文件,再用上述方式导入 R 中,或者使用readxl包中的read_excel()函数(当明确文件类型是 .xls 还是 .xlsx 时,直接使用read_xls()函数或read_xlsx()函数)。

此外,还有其他包可以用来导入 Excel 数据,例如xlsxXLConnectopenxlsx,其中xlsxXLConnect需要依赖 Java。

在 RStudio 中,从 Excel 或者文本格式导入数据的操作,可以通过点击

从其他统计软件导入数据

haven包提供了从其他统计软件导入数据的函数:

  • 从 SPSS 导入:使用read.spss()函数;

  • 从 SAS 导入:使用read_sas()函数;

  • 从 Stata 导入:使用read_dta()函数。

从网页获取数据

从网页获取数据主要有两种方式,一种是通过 Web API,一种是通过网页抓取(Web Scraping)。

Web API

可以参考CRAN上的 Web Technologies and Services 任务列表,其中列出了各种从网络获取数据资源的 R 包,例如常见的社交网站 Twitter,Facebook,Instagram,LinkedIn 等等。

网页抓取

比如使用readLines()函数从网页获取文本,再使用grep()gsub()等函数处理字符串。R 包rvest提供了一些可以简化网页抓取的函数(参考了 Python 库beautifulsoup4),是一个流行的网页抓取包,此外还有RCurlXML包等等。更多关于用 R 进行网页抓取的内容可以参考这篇博客

导入 JSON 数据

可以使用jsonliterjsontidyjson等包。

访问数据库管理系统

ODBC 接口

在 R 中访问一个数据库最常见的方式就是通过开放数据库连接(Open Database Connectivity, ODBC),这需要在计算机上先安装与自己系统和数据库相应的 ODBC 驱动,然后安装并且使用RODBC包。在 RStudio 中,点击右上角的窗口中的”Connections”按钮,就可以通过调用odbc包来访问数据库,如下图所示。

DBI 相关包

除了 ODBC 外,还可以基于数据库接口(Database Interface, DBI) 访问数据库,例如通过Java数据库连接(Java Database Connectivity, JDBC),这需要在计算机上先安装与自己系统和数据库相应的 JDBC 驱动,然后安装并且使用RJDBC包。除了RJDBC包外,还有其他基于DBI的包,如RMySQLROracleRPostgreSQLRSQLite

在 RStudio 中导入数据

在RStudio 中,上述许多操作都可以通过点击右上角的窗口中的”Import Dataset”按钮来完成,如下图所示。RStudio 会自动生成相应的代码来导入文件。

通过 Stat/Transfer 导入数据

Stat/Transfer 是一款功能强大的数据格式转换软件,可以完成前面的几乎所有格式转换和导入导出任务,唯一的缺点是,它不是免费的。

数据输出

最后来简单介绍一下如何使用 R 输出数据,相比于输入数据,我们往往不是那么关心输出数据,下面主要介绍三种输出格式。

输出为 .csv 文件

使用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表示是否将字符串用引号括起来,默认取TRUEsep表示分隔符,默认为" "na指定用什么字符表示缺失值NA。这里只列出了基本的常用参数,更多可选参数见帮助文档。

输出为 Excel 表格

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指定导入的目标统计软件。