跳至主要内容

将数据导入 R —— 第二部分

一篇关于将数据导入 R 的教程。重点介绍从统计软件、数据库、网页抓取等来源读取数据的方法。
· 15分钟 阅读

使用 AI 探索

在这篇对R 数据导入教程(第一部分)的后续教程中,DataCamp 继续以全面且易上手的方式,带您快速将数据导入 R,从简单的纯文本文件到更高级的 SPSS 与 SAS 文件。

正如许多读者从第一篇文章中敏锐指出的,一些用于将数据导入 R 的优秀包尚未得到关注,文章也未明确区分处理标准数据集与超大数据集的不同。为此,今天的文章将重点弥补这些内容。

继续阅读,发现更多将特定文件导入 R 的方法。如果您还有其他问题或发现需要更正的错误,欢迎联系我们。

(试试这门互动课程:Importing Data in R (Part 1),在 R 中处理 CSV 和 Excel 文件。)

从常见来源将数据导入 R

首先,本文将更深入地介绍如何将常见来源(通常是类似电子表格的数据)导入 R。与上一篇一样,重点是读取非 Excel 或其他类型的文件进入 R。

接着,将讨论来自统计软件、数据库、网页抓取等来源的数据。

如果您想了解在导入数据前可能需要执行的准备步骤,请前往我们的第一篇文章,其中解释了如何在将数据导入 R 前准备数据和工作区。

使用 scan() 将纯文本文件读入 R

除了在R 数据导入教程的第一部分中提到的 read.table() 外,scan() 函数同样适用于处理以简单分隔文本文件存储的数据。与 read.table() 不同,scan() 返回的是列表或向量,而不是数据框。

假设您有如下 .txt 文档:

24 1991
21 1993
53 1962

您可以使用以下命令读入数据(可在这里下载):

data <- scan("birth.txt")

注意,您的文件也可以是在线数据集。在这种情况下,只需将 URL 作为 scan() 的第一个参数传入即可。

或者,您也可以将数据读入矩阵:

data <- matrix(scan("birth.txt"),
               nrow=2,
               byrow=TRUE)

提示:如果您想更严谨地处理,可能需要指定更多参数以得到所需的矩阵形式。关于 matrix() 函数的更多信息,请参阅此页面。

您也可以将输入文件的各列分别读入不同的向量:

data <- scan("age.txt",
             what = list(Age = 0,
                         Birthyear= 0),
             skip=1,
             quiet=TRUE)

注意,首先传入带扩展名的文件(路径)作为参数(取决于您是否将工作目录设置为包含数据集的文件夹),然后再指定要读取的数据类型、是否跳过数据集的第一行、字段分隔符字符,以及是否打印读取了多少项的提示信息。

如果数据中包含其他数据类型,您应对 scan() 进行适当调整,如下例所示:

data <- scan("age.csv",
             what = list(Age = 0,
                         Name= "",
                         Birthyear= 0),
             skip=1,
             sep=";",
             quiet=TRUE)

提示:您也可以自己动手试试!可在这里下载上述使用的文本文件。

随后,您也可以将数据读入数据框:

data <- data.frame(scan("age.csv",
                        what = list(Age = 0,
                                    Name = "",
                                    Birthyear= 0),
                        skip=1,
                        sep=";",
                        quiet=TRUE)

提示:scan() 的许多参数与 read.table() 相同。因此,查阅文档总是有用的!如需了解 scan() 参数,请点击这里。

请记住,您可以分别通过以下命令获取与设置工作目录:

getwd()
setwd("<path to your folder>")

使用 read.fwf() 将定宽列数据导入 R

要将“定宽格式数据表”读入 R 的数据框,您可以使用 read.fwf()(来自 utils 包)。

当您的数据文件包含带空格的列,或相邻列之间没有空格分隔时,可使用此函数。

   Phys / 00 / 1:    M  abadda
   Math / 00 / 2:    F  bcdccb
   Lang / 00 / 3:    F  abcdab
   Chem / 00 / 4:    M  cdabaa

在这里,例如您知道学科名称总是位于每行的前 7 个字符,性别值总是在第 22 个字符,成绩从第 25 到第 30 个字符。

如果您想试着将这些数据载入 R,可在这里下载文本文件。

要将上述数据正确导入 R,您需要执行以下命令:

read.fwf("scores.txt",
         widths= c(7,-14,1,-2,1,1,1,1,1,1),
         col.names=c("subject","sex","s1","s2","s3","s4","s5","s6"),
         strip.white=TRUE)

注意,widths 参数给出定宽字段的宽度。本例中,文件的前 7 个字符保留给课程名称;然后,您不想读取接下来的 14 个字符,于是传入 -14。接着,性别占 1 个字符,但不需要随后的两个字符,因此传入 -2。之后所有字符需分别读入各列,因此以 1,1,1,1,1,1 进行切分。当然,这些值会根据您要导入的列而变化。

read.fwf() 还可以接受若干额外参数。点击这里了解更多。

注意,如果您想使用 Fortran 风格的格式说明来读入文件,可以使用 read.fortran() 函数:

data <- tempfile()
cat(file = data, "345678", "654321", sep = "\n")
read.fortran(data, c("F2.1","F2.0","I2"))

如上方小例所示,您将 Fortran 风格的格式说明作为 read.fortran() 的第二个参数。可传入的参数样式包括:“rFl.d”、“rDl.d”、“rXl”、“rAl”或“rIl”,其中“l”为列宽,“d”为小数位数,“r”为重复次数。本例通过 c() 传入 2.1、2.0 和 2,表示有三列、两行。第一列为一位小数,第二、三列为无小数位的数值。

至于列中值的类型,您可以有:

  • “F”和“D”表示数值格式;
  • “A”表示字符值;
  • “I”表示整数值;
  • “X”表示可跳过的列。

本例中,第一、二列为数值格式,第三列为整数值。

注意,重复码“r”和小数位码“d”始终可选。长度码“l”是必需的,除非在 “X” 格式且存在“r”时。

将(Google)电子表格导入 R

正如您可能在我们关于在 R 中读取与导入 Excel 文件的教程或第一篇R 数据导入教程中已读到的,电子表格可以通过多种方式导入 R。本节将进一步展开,涵盖 Google 表格与 DIF 文件!

继续往下,了解如何将电子表格导入 R。

将 Excel 电子表格导入 R

除了 xlsx 包,您还有多种选项可将电子表格读入 R:

1. 从剪贴板将 Excel 电子表格读入 R

如果您打开了电子表格,实际上可以将内容复制到剪贴板并快速导入 R。为此,您可以使用 readClipboard() 或 read.table():

readClipboard() #Only on Windows
read.table(file="clipboard")`

如您亲自尝试会发现,第一种方法对向量数据较合适,但对于剪贴板中的表格数据会较复杂。若想进一步了解 read.table(),请务必参阅 R 数据导入教程的第一部分或我们关于在 R 中读取与导入 Excel 文件的教程。

2. 通过 RODBC 包将 Excel 电子表格导入 R

第二种方法是通过 RODBC 包:

  • 一种用法如下:
library(RODBC)
connection <- odbcConnect("<DSN>")

注意,传给 odbcConnect() 的参数实际上是 DSN。关于如何配置 DSN、建立连接等的完整指南,请参阅此页面,内容详尽且易上手!

  • 设置好连接后,您也可以使用 sqlQuery() 从 .xls 表格读取数据:
query <- "<SQL Query>"
data <- sqlQuery(connection,
                 query)
str(data)

强烈推荐:前往此页面获取详尽且易上手的教程!

在 R 会话结束时,别忘了关闭连接:

odbcCloseAll()

提示:如果您想进一步了解将电子表格或 Excel 文件导入 R,请务必查看我们的导入数据到 R第一篇教程,或阅读我们关于在 R 中读取与导入 Excel 文件的教程,其中也介绍了 readxl 与 XLConnect 等包。

将 Google 表格导入 R

googlesheets 包及其 gs_read() 函数可将 Google 表格读入 R。

先执行以下代码:

gs_ls()

让浏览器启动并完成认证。随后,如果您想读取或编辑数据,需要先注册该表格。您可按标题或 key 指定表格:

data <- gs_title("<your spreadsheet>")
data <- gs_key()

接下来读取数据:

gs_read(data)

以上只是 googlesheets 包的简要概览。务必阅读这里的详细说明,并查看此页。

将 DIF(数据交换格式)文件读入 R

使用 read.DIF() 将 DIF 文件导入 R:

data <- read.DIF("<your spreadsheet>",
                 header=FALSE,
                 as.is = !stringsAsFactors)

注意,您可指定电子表格是否包含表头,以及是否“按原样”导入数据,即字符变量是否转换为因子。本例中不希望转换为因子,因此使用 !stringsAsFactors。

关于该函数及其参数的更多信息,请访问此页面。

将 Excel 文件导入 R

除了电子表格,您或许也希望将实际的 Excel 文件导入 R。继续阅读了解具体方法!

注意,本文仅在我们在 R 中读取与导入 Excel 文件教程以及第一篇R 数据导入教程的基础上进一步展开!

使用 readxl 将 Excel 文件导入 R

尽管该包仍在积极开发中,但非常值得一试,因为它能非常轻松地读取 Excel 文件:

library(readxl)
read_excel("<path to file")

请记住,如果文件夹在您的工作目录中,只需输入文件名及其扩展名即可。使用以下代码获取与设置工作目录:

getwd()
setwd("<Path to your folder>")

注意,您可以分别通过 sheet、col_names、col_types、na 与 skip 参数指定要读取的工作表、列名与类型、缺失值以及读取数据前要跳过的行数。详见这里。

使用 openxlsx 将 Excel 文件读入 R

openxlsx 包也提供了简单的方法将 .xlsx Excel 文件读入 R:

library(openxlsx)
read.xlsx("<path to your file>")

如需了解该包或 read.xlsx() 可传入的参数,点击这里。

提示:若想进一步了解将 Excel 文件导入 R,请查看我们的“将数据导入 R”首篇教程,或阅读我们更为详尽的在 R 中读取与导入 Excel 文件的教程,其中也介绍了 XLConnect 等包。

将 OpenDocument 电子表格导入 R

使用 read.ods()(来自 readODS 包)将 OpenDocument 电子表格读入 R 并转为数据框:

library(readODS)
read.ods("<path to your file>",
         sheet = 1,
         formulaAsFormula = FALSE)

注意,除文件外,您还可以指定要读取的工作表,并决定是显示公式本身(例如 “SUM(B1:B3)”)还是显示计算结果。

将 JSON(JavaScript 对象表示法)文件导入 R

在我们的第一篇数据导入文章中,曾提到使用 rjson 包将 JSON 文件导入 R。

不过,您也可以使用其他包来导入 JSON 文件。继续阅读了解更多!

使用 jsonlite 包导入 JSON 文件

在最常下载的R 包前 25 名中,jsonlite 以 66952 次下载名列其中,深受 R 用户喜爱。

使用 fromJSON() 导入 JSON 文件:

library(jsonlite)
data <- fromJSON("<Path to your JSON file>")

关于 jsonlite 的上手指南,请查看这里。

使用 RJSONIO 包导入 JSON 文件

另一款常用的 JSON 导入包是 RJSONIO。与 jsonlite 类似,同样使用 fromJSON():

library(RJSONIO)
data <- fromJSON("<Path to your JSON file")

最佳 JSON 包?

关于此话题已有不少讨论。如果您想了解更多,务必查看以下页面与文章:

  • 这篇页面主要通过代码示例说明,帮助您更深入了解 R 中 JSON 包的行为与性能。
  • 强烈推荐阅读这篇博文,尝试找出在 R 中处理 JSON 数据表现最佳的包。

将统计软件包的数据导入 R

如果您的数据并非表格型,且不是 Excel 或 JSON 文件,它可能来自某款统计软件。

本节将介绍更多将 SPSS、Stata 或 SAS 文件读入 R 的方法,同时概览来自 S-plus 与 Epi Info 的文件导入。若想了解更多,请务必回看我们的第一篇文章或文末所附链接。

将 SPSS 文件导入 R

除了使用 foreign 包,您也可以借助 haven 包将 SPSS 文件导入 R。

请记住,开始前请确保在工作区安装并加载该包!

haven 包提供 read_spss() 函数读取 SPSS 文件:

library(haven)
data <- read_spss("<path to your SPSS file>")

将 Stata 文件导入 R

与 foreign 包类似,haven 也提供读取 Stata 文件的函数 read_dta():

data <- read_dta("<path to your STATA file>")

请记住,必要时请先安装并加载包。例如,您可以通过以下命令安装并加载 haven:

install.packages("haven")
library(haven)

将 SAS 文件导入 R

由于在上篇文章中已提到 sas7bdat 包,本篇将聚焦于读取 SAS 文件的其他方法:

1. 使用 foreign 包将 SAS XPORT 文件导入 R

foreign 包中的 read.xport() 也可将 SAS XPORT 文件导入 R:

library(foreign)
data <- read.xport("<path to your SAS file>")

2. 使用 SASxport 包将 SAS XPORT 文件导入 R

sasXPORT 包也可用 read.xport() 读取 SAS XPORT 文件:

library(SASxport)
data <- read.xport("<path to your SAS file>")

3. 使用 haven 包将 SAS 文件导入 R

与 foreign 与 sas7bdat 包类似,haven 包也可通过 read_sas() 读取 b7dat 文件:

library(haven)
data <- read_sas("<path to your SAS file>")

将 S-plus 文件导入 R

对于旧的 S-plus 数据集(Windows 3.x、4.x 或 2000 版本,或 Unix 3.x 且为 4 字节整数生成的),可使用 foreign 包中的 read.S() 函数:

library(foreign)
data <- read.S("<Path to your file>")

将 Epi Info 文件读入 R

如您在前文或本文已读到,foreign 包提供许多用于读取特定文件的函数,其中也包括 Epi Info。使用 read.epiinfo() 将数据导入 R:

library(foreign)
data <- read.epiinfo("<Path to your file>")

关于 Epi Info 的更多信息,请点击这里。

从其他来源将数据导入 R

除了常见来源与统计软件外,还有许多其他来源的数据也可能需要读入 R。

下面列出其中一些。继续阅读!

将 MATLAB 文件导入 R

可以使用 R.matlab 包及其 readMat() 函数,将 MATLAB 文件导入 R。

该函数的第一个参数可传入字符字符串或原始向量。第一种情况下,输入将被解释为文件名;第二种情况下,则视为原始二进制连接:

library(R.matlab)
data <- readMat("<Path to your file>")

readMat() 将返回一个具名列表结构,包含从导入的 MAT 文件中读取的所有变量。

将 Octave 文件读入 R

foreign 包再次登场!使用 read.octave() 将 Octave 文本数据导入 R:

library(foreign)
data <- read.octave("<Path to your file>")

将 FitbitScraper 数据导入 R

您可以使用 fitbitScraper 包从 fitbit 获取数据。

(对于不熟悉该公司的读者:该公司提供活动追踪器等科技设备,用于测量步数、睡眠质量等个人数据。)

关于如何使用 fitbitScraper 包的简短实用教程,请见这里。

将 Quantmod 数据导入 R

您可以使用该包从互联网来源提取金融数据至 R。用于获取数据的函数是 getSymbols(),示例如下:

library(quantmod)
data <- getSymbols("YHOO", src="google")

注意,首先指定一个字符向量,包含要加载的每个符号的名称,此处为 "YHOO"。随后定义来源方式。目前可用的来源包括 yahoo、google、MySQL、FRED、csv、RData 和 oanda。

接下来,指定查找参数并保存以便将来会话使用:

setSymbolLookup(YHOO='google',GOOG='yahoo')
saveSymbolLookup(file="mysymbols.rda")

新的会话中调用

loadSymbolLookup(file="mysymbols.rda")
getSymbols(c("YHOO","GOOG"))

如果您想了解更多关于在 R 中进行定量金融分析的信息,请点击这里,或前往此页面查看针对初学者的 quantmod 详细教程。

将 ARFF 文件导入 R

可使用 read.arff() 函数读取 Weka 的属性-关系文件格式(ARFF):

library(foreign)
data <- read.arff("<Path to your file>")

关于该函数的更多信息,参见此页面。

注意,RWeka 包也提供相同函数用于导入 ARFF 文件。若想了解更多,请点击这里!

将数据库中的数据导入 R

除了上一篇中介绍的 MonetDB.R、rmongodb 与 RMySQL,还有其他包可用于在 R 中连接数据库。

您还可以使用 mongolite、RMongo、RODBC、ROracle、RPostgreSQL、RSQLite、RJDBC。

关于这些包的教程,请查看以下列表:

注意,还有数据库接口包 DBI,用于在 R 与关系型数据库管理系统之间通信。更多信息请点击这里。

关于如何使用该包的说明,可参见这里。

将二进制文件导入 R

二进制数据文件以二进制位分组存储信息。每个二进制位为 0 或 1。八个二进制位组成一个字节。您可以使用 readBin() 读取二进制数据:

connection <- file("<path to your file>", "rb") #You open the connection as "reading binary"(rb)
data <- readBin(connection,
                what="numeric") #Mode of the vector to be read

更详细的示例请见此页面。关于 readBin() 的更多信息,点击这里。

将二进制数据格式读入 R

hdf5、h5r、rhdf5、RNetCDF、ncdf 与 ncdf4 等包提供对 NASA 的 HDF5 和 UCAR 的 netCDF 数据文件的接口。

若您对在 R 中处理 HDF5 或 netCDF 文件的教程感兴趣,可参考以下资源:

  • 一篇关于在 R 中处理 HDF 文件(并使用 pathfinder 包)的优秀教程在这里;
  • 一篇易上手的 netCDF 初学者教程见此页面。

将 DBF 文件导入 R

DBF(DataBase File)是 dBase 的底层格式。可使用 foreign 包提供的 read.dbf() 读取 DBF 文件:

library(foreign)
data <- read.dbf("<Path to your file>")

注意,如果您在 Windows 下,也可使用 RODBC 包的 odbcConnectDbase(),通过微软的 dBase ODBC 驱动读取 DBF 文件。

将“扁平”列联表导入 R

foreign 包允许读取多种文件格式;“扁平”列联表也不例外。您可以使用 read.ftable() 完成此操作:

library(foreign)
data <- read.ftable("<Path to your file>")

请记住,“扁平”列联表与“普通”列联表非常相似:它们都包含变量(因子)各水平组合的计数。但信息被重新排列为矩阵形式,矩阵的行与列对应行、列表达式的水平唯一组合。因此,“扁平”列联表常用于表示更高维度的列联表。

将 GIS(地理信息系统)文件读入 R

您可以使用 rgdal 与 raster 等包将 GIS 文件导入 R。

如不确定如何上手 rgdal 包,可参考这篇优秀博文,介绍在 R 中处理地理空间数据。

您也可查看本教程,其中同时使用了 rgdal 与 raster。

将 ITIS(综合分类信息系统)表导入 R

您可使用 read.table() 导入 ITIS 表:

data <- read.table("<Path to your file>")

关于 ITIS 的更多信息,请点击这里。

将大型数据集导入 R

导入大型数据集常在 R 用户间引发讨论。除了用于连接数据库的包外,还有一些在大数据处理方面表现突出的包。

使用 data.table 包导入大型数据集

被称为“快速且友好的文件处理器”的热门 data.table 包极其好用、易于上手。其 fread() 函数旨在直接从规则的分隔文件导入数据到 R,无需绕路或繁琐步骤。

注意,此处“规则”指每一行必须拥有相同数量的列。例如:

  V1 V2 V3
1  1  6  a
2  2  7  b
3  3  8  c
4  4  9  d
5  5 10  e

该函数的优势之一在于,诸如 sep、colClasses 与 nrows 等控制参数可自动检测。并且,bit64::integer64 类型也会被检测并直接读取,无需先作为字符再转换。

请记住,bit64::integer64 类型是 64 位整数:这些数字在计算机中以 64 位长度存储。默认通常为 32 位。由于能检测到 bit64::integer64 类型,系统知道它是数字,而不会先以字符读入再转为整数。

fread() 的一个示例:

library(data.table)
data <- fread("http://assets.datacamp.com/blog_assets/chol.txt")
data
##      AGE HEIGHT WEIGHT CHOL  SMOKE BLOOD  MORT
##   1:  20    176     77  195 nonsmo     b alive
##   2:  53    167     56  250 sigare     o  dead
##   3:  44    170     80  304 sigare     a  dead
##   4:  37    173     89  178 nonsmo     o alive
##   5:  26    170     71  206 sigare     o alive
##  ---
## 196:  35    174     57  222   pipe     a alive
## 197:  38    172     91  227 nonsmo     b alive
## 198:  26    170     60  167 sigare     a alive
## 199:  39    165     74  259 sigare     o alive
## 200:  49    178     81  275   pipe     b alive

注意,使用 fread() 读入数据会返回一个 data.table:

str(data)
## Classes 'data.table' and 'data.frame':   200 obs. of  7 variables:
##  $ AGE   : int  20 53 44 37 26 41 39 28 33 39 ...
##  $ HEIGHT: int  176 167 170 173 170 165 174 171 180 166 ...
##  $ WEIGHT: int  77 56 80 89 71 62 75 68 100 74 ...
##  $ CHOL  : int  195 250 304 178 206 284 232 152 209 150 ...
##  $ SMOKE : chr  "nonsmo" "sigare" "sigare" "nonsmo" ...
##  $ BLOOD : chr  "b" "o" "a" "o" ...
##  $ MORT  : chr  "alive" "dead" "dead" "alive" ...
##  - attr(*, ".internal.selfref")=<externalptr>

这与 read.table() 不同,后者会创建数据框。

关于数据框与 data.table 的差异,详见这里。简而言之,最重要的一点是:所有 data.table 也是 data.frame。data.table 可传递给只接受 data.frame 的包,该包可以对 data.table 使用 [.data.frame 语法。更多 data.table 内容见这里。

library(data.table)
data <- fread("http://assets.datacamp.com/blog_assets/chol.txt",
              sep=auto,
              nrows = -1,
              na.strings = c("NA","N/A",""),
              stringsAsFactors=FALSE
              )

注意,输入也可以是本地文件,而非 URL。另请注意,许多参数与您在 read.table() 中使用的相同。

提示:想更深入了解 data.table?也许我们的课程Data Analysis In R, The data.table Way会对您有帮助!在Matt Dowle 与 Arun Srinivasan 的指导下,您将迅速从 data.table 新手成长为专家。

使用 ff 包导入大型数据集

ff 包支持“将大型数据以内存高效的方式存储在磁盘上,并提供快速访问函数”。当您查阅将大数据读入数据框的讨论时,它经常被提及,例如这里。

如果要将分隔的纯文本文件导入 ff 数据框,可像使用 read.table() 及其变体或便捷封装(已在先前博文介绍)那样,使用 read.table.ffdf()、read.csv.ffdf()、read.csv2.ffdf()、read.delim.ffdf() 或 read.delim2.ffdf():

bigdata <- read.table.ffdf(file="<Path to file>",
                           nrows=n)

注意,第一个参数可以为 NULL(如本例)或指定一个可选的 ffdf 对象,读取的记录将追加到该对象。详情请见这里。随后,通过 file 参数指定要读取数据的文件;您也可以通过 nrows 指定读取的最大行数(与 read.table() 相同!)。

您还可以进一步指定文件编码、因子水平,或用于读取每个分块的函数名:

library(ff)
bigdata <- read.table.ffdf(file="<Path to file>",
                           nrows=n,
                           fileEncoding="",
                           levels=NULL,
                           FUN="read.table")

提示:read.table.ffdf()、read.csv.ffdf()、read.csv2.ffdf()、read.delim.ffdf() 与 read.delim2.ffdf() 可用的更多参数见这里。

使用 bigmemory 导入大型数据集

另一个在“大数据 + R”相关搜索中常出现的包是 bigmemory。它可“通过共享内存与内存映射文件管理海量矩阵”。

注意,该包无法在 Windows 上使用:暂无 Windows 二进制文件。

library(bigmemory)
bigdata <- read.big.matrix(filename="<File name>",
                           sep="",
                           header=TRUE,
                           skip=2)

通常先将文件名传入函数,然后可开始指定其他选项,如分隔符、是否包含表头、在开始读取前跳过的行数,分别通过 sep、header 与 skip 参数设置。

注意,以上仅为少数示例!read.big.matrix() 还能接受更多参数!如需了解更多,请阅读文档。

使用 sqldf 将大型数据集读入 R

sqldf 也是处理大型数据集时可考虑的包。它允许“在 R 中执行 SQL 查询”,其中 read.csv.sql() 尤其适用于在将文件读入 R 时,以 SQL 语句筛选,这样只有部分数据会被 R 处理:

library(sqldf)
bigdata <- read.csv.sql(file="<Path to your file>",
                        sql="select * from file where ...",
                        colClasses=c("character",
                                     rep("numeric",10)))

注意,上述示例与其他导入大型数据集的函数非常相似,唯一的不同是传给 read.csv.sql() 的第二个参数是 SQL 语句。您在 SQL 查询中引用的表来自于 file 参数指定的文件。

提示:关于 sqldf 的更多信息,可观看该视频教程,或阅读这篇文字概览。

使用 read.table() 导入大型数据集

您可以使用“标准”的 read.table() 导入数据,但相比专为大数据设计的包,这可能更耗时。关于 read.table() 的用法,请回到我们的第一篇文章。

为加快该函数,您可以自行做些优化,即为常用的 read.table() 添加一些参数,示例如下:

df <- read.table("<Path to your file>",
                 header = FALSE,
                 sep="",
                 quote = "",
                 na.strings = "EMPTY",
                 colClasses = c("character", "numeric", "factor"),
                 strip.white = TRUE,
                 comment.char="",
                 stringsAsFactors = FALSE,
                 nrows = n
                 )

注意:

  • 首先传入(路径加)文件名,具体取决于您是否已将工作目录设置为文件所在的文件夹。
  • 然后使用 header 指示文件首行是否包含变量名。本例中为否。
  • 通过 sep 将字段分隔符设置为 /;即文件每行的值由该字符分隔。
  • 接着您可以选择启用或禁用引用。本例中 quote="",表示禁用。
  • 同时定义数据集中字符串 “EMPTY” 视为 NA 值。
  • 然后定义列的类型:第一列为字符,第二列为数值,最后一列为因子。
  • 设置 strip.white 以移除未加引号的字符字段的首尾空格;仅当使用了 sep 参数时适用!
  • 当 comment.char 设为 "" 时,关闭注释解释。
  • 不希望将字符转换为因子!因此设置了 colClasses,并进一步通过 stringsAsFactors = FALSE 进行确认。
    提示:该参数与 colClasses、comment.char 一样,是顺利导入数据时较重要的参数!
  • 最后,设置要读取的最大行数。

提示:关于 read.table() 所有可传入参数的更多信息,强烈建议阅读我们关于在 R 中读取 Excel 文件的文章。

使用 readr 包导入大型数据集

readr 也是导入大型数据集的快速选择之一,它允许像 read.table 一样读取表格型文本数据。但 readr 提供了“若干替代函数,具备额外功能且速度更快”(见这里)。

df <- read_table("<Path to your file>",
                 col_names=TRUE)

注意,readr 还提供 read_csv()、read_csv2()、read_delim()、read_fwf()、read_tsv() 等函数,这些都比原版更快!详情见这里。

提示:关于该包的更多信息可在这个 GitHub 页面找到。

关于在 R 中处理大数据的一些备注

若需更多在 R 中处理大数据的技巧,建议查看这条 StackOverflow 讨论,其中既涉及包,也包含如将数据存为二进制格式、使用 saveRDS/readRDS,或针对 HDF5 格式使用 rhdf5 等建议。

注意,最后这种文件格式已在上文介绍,且除上文提到的包外,还有许多其他包。例如,用于连接数据库的包(如 RODBC 与 MonetDB.R)也可轻松用于处理更大的数据集;另外在直接处理存储于多种数据库中的数据时,dplyr 也非常有价值。

提示:对在 R 中进行数据整理感兴趣?不妨尝试我们的dplyr 互动课程!在 Garrett Grolemund 的指导下,您将学习如何使用 dplyr 完成复杂的数据操作任务。

别忘了看看这篇有趣的文章,其测试了上述部分包的加载性能!

使用 rio 包将数据导入 R

这把“数据输入/输出的瑞士军刀”让您在 R 中输入与输出数据更轻松!几乎可以对任何文件格式进行输入或输出:安装 rio 包时,您其实是将许多独立的数据读取包汇集于一处。之后,进行数据输入或输出时,只需记住两个函数:import() 与 export():rio 会依赖独立的数据读取包,通过文件扩展名推断数据结构、原生读取基于网络的数据源,并为导入与导出设置合理的默认值。

简而言之,rio 支持广泛、常用的导入与导出文件类型。

使用 rio 导入文件的方法如下:

library(rio)
data <- import("<Path to your file>")

若想查看 rio 支持的具体文件格式,请访问此页面。

结束语

如果您对在 R 中处理大数据感兴趣,务必查看 DataCamp 的课程:How To Work With Quandl in R 与 “Big Data Analysis With Revolution R Enterprise”!

主题