数据获取是任何一款致力于数据分析挖掘工具都必须具备的基础功能。R语言除了自身拥有丰富的数据集,还可以通过丰富的系统命令和扩展包来获取或导入外部数据。下面将从常用的文本数据、Excel格式数据出发,探讨6种数据导入方法。
1. 导入R语言系统格式数据
除了自带数据集,R语言系统本身包含*.RData和*.rds两种数据存储格式。根据官方手册介绍,这两种数据格式的区别在于:前者既可以存储数据,也可以存储当前工作空间的所有变量,属于非标准化存储;后者则仅用于存储单个R对象,且存储时可以创建标准化档案,属于标准化存储。通过load()函数和readRDS()函数可以分别实现*RData格式和*.rds格式的读取:
举例:
存储和读取单个R对象: saveRDS(object, file), my_data <- readRDS(file)
存储和读取多个R对象: save(data1, data2, file = “my_data.RData”), load(“my_data.RData”)
存储和读取整个工作空间: save.image(file = “my_work_space.RData”), load(“my_work_space.RData”)
2. 导入带有分隔符的文本数据
带有分隔符的文本数据形式是常用的数据存储方式之一,该数据通常以行列结构呈现,列与列之间以固定字符(如逗号、空格、分号等)进行分割,行与行之间使用换行符进行分割。特点是格式简单,轻量级,易识别。R语言通常使用read.table来读取此类数据,下面以读取采用逗号分隔的TXT格式的数据文件为例来说明read.table()函数的使用,示例数据如下图所示:
data <- read.table(file = "airquality.txt", header = T, sep = ",", stringsAsFactor = F, fileEncoding = "UTF-8")
head(data)
使用read.table()函数读取带有分隔符的文本文件需要注意以下5个参数的设置问题。
(1)file:需要导入的文本数据文件,其后缀名可以是txt、dat、csv等。
(2)header:导入数据时是否带有列标题,默认为TRUE。
(3)sep:列与列之间的文本分隔符。
(4)stringsAsFactor:导入数据时是否将字符串数据转为因子,默认为TRUE。
(5)fileEncoding:文本数据的文件编码,如涉及中文字符,建议设置为GBK,默认设置为UTF-8。
除了read.table()函数,R语言base包还有read.csv(),read.csv2()、read.delim()和read.delim2()等函数, 相关参数设置与read.table()函数类似,这里不再赘述。
写入文本文件
文本文件因其易读性成为中小规模数据存储的首选。R语言写入文本文件可以使用write.csv()函数和write.table()函数完成,示例代码如下:
write.csv(x=iris, file = "iris.csv", append = FALSE, row.names = FALSE, fileEncoding = "GBK")
write.table(x = iris, file = "iris.csv", append = FALSE, row.names = FALSE, sep = ",", fileEncoding = "GBK")
iris1 <- read.csv("iris.csv")
iris2 <- read.table("iris.txt", sep=",", header = T)
# 验证数据一致性
identical(iris, iris1)
identical(iris, iris2)
以上代码运行结果如下:
[1] TRUE
[2] TRUE
上例中两个函数有6个重要参数,在实际运用中应加以注意,它们分别如下:
(1)x:数据框或矩阵,需要写入的数据集。
(2)file:字符型,需要写入数据文件的名称。
(3)append:逻辑型,判断是否需要在已有的数据文件后面追加当前数据集。默认FALSE。
(4)row.names:逻辑型,判断写入数据时是否将行名称一并写入。
(5)sep:字符型,数据分隔符。
(6)fileEncoding:字符型,写入数据文件的编码,如果数据集中有中文,建议将此参数设置为GBK,即fileEncoding="GBK".
3. 导入Excel数据
在日常数据处理中经常会遇到Excel格式的数据, 早期R语言内置的base包中并没有函数可以处理此类数据文件,需要将其转化为其他格式(如CSV或TXT),然后再使用R语言内置的read.table()函数读取。随着R的兴起,众多R语言开发者在Java、C、Perl或C++等语言库的基础上,编写了大量可读/可写Excel数据格式的R扩展包,目前最常用的扩展包有openlsx(基于C++)、xlsx(基于Java) XLConnect(基于Java)和readxl(基于C)等,下面将中的数据转存为Excel格式文件,并分别演示如何使用上述4种扩展包读取Excel数据文件。
3.1 使用openxlsx包读取Excel数据文件
openxlsx包主要通过getSheetNames()函数和read.xlsx()函数实现Excel数据文件的读取,示例代码如下:
if (!require("openxlsx")){
install.packages("openxlsx")
}
data1 <- openxlsx::read.xlsx(xlsxFile = "airquality.xlsx", sheet = 1 )
# head(data1)
sheet_name <- openxlsx::getSheetNames(file = "airquality.xlsx")
sheet_name
以上代码运行结果如下:
Loading required package: openxlsx
Warning message:
package ‘openxlsx’ was built under R version 4.0.5
[1] "Sheet1"
上例中,getSheetNames()函数主要用于获取当前Excel文件中的工作簿名称,此函数非常适合读取多个Excel文件且不清楚当前Excel文件工作簿名称的情况。read.xlsx()函数则用于读取当前Excel文件制定的工作数据,其中,sheet参数既可以是工作簿名称,也可以是工作簿序号(如1表示第一个工作簿)
3.2 使用xlsx包读取Excel数据文件
与openxlsx包类似,xlsx包也是通过read.xlsx()函数读取Excel数据文件的,读取方式同样包括制定工作簿名称和指定工作簿序号两种,示例代码如下:
if (!require("xlsx")){
install.packages("xlsx")
}
# 方式一:指定工作簿序号
data1 <- xlsx::read.xlsx(file = "airquality.xlsx", sheetIndex = 1, sheetName = NULL)
# 方式二:指定工作簿名称
data2 <- xlsx::read.xlsx(file = "airquality.xlsx", sheetIndex = NULL, sheetName = "airquality")
上例中的read.xlsx()函数与openxlsx包的read.xlsx()函数不仅名称相同,用法也非常类似,建议在调用时使用::区分开。两个函数不同之处在于对参数的设置,xlsx::read.xlsx()函数读取Excel文件主要依赖file(文件名称)、sheetIdex(工作簿序号)和sheetName(工作簿名称)这两个参数。
3.3 使用XLConnect包读取Excel数据文件
使用XLConnect包读取Excel数据文件主要有两种方式:一种是通过使用loadWorkbook()函数加载工作簿,然后用readWorksheet()函数读取指定工作簿的文件:另一种是直接使用readWorksheetFromFile()读取工作簿数据,示例代码如下:
if (!require("XLConnect")){
install.packages("XLConnect")
}
library("XLConnect")
# 方式一: 加载工作簿方式读取
wb <- XLConnect::loadWorkbook(filename = "airquality.xlsx", create = T)
sheet_index <- XLConnect::getSheets(wb)
data <- XLConnect::readWorksheet(wb, sheet = sheet_index[1])
head(data)
#方式二:直接读取Excel文件
data <- XLConnect::readWorksheetFromFile(file="airquality.xlsx", sheet = 1)
head(data)
上例中,用方式1读取较为麻烦,建议实际应用中直接采用方式2读取。
3.4 使用readxl包读取Excel数据文件
readxl包是Rstudio内置读取Excel数据文件的专用包,该包主要使用read_excel()函数读取Excel数据,示例代码如下:
if (!require("readxl")){
install.packages("readxl")
}
data <- readxl::read_excel(path = "airquality.xlsx", sheet = 1, range = NULL, col_names = TRUE, col_types = NULL, na = "", rim_ws = TRUE)
head(data)
上例中read_excel()函数运行时需要注意以下7个参数。
(1)path:字符型,Excel数据文件所在的路径,后缀名既可以是xls,也可以是xlsx。
(2)sheet:字符型或整数型,需要读取的工作簿既可以是工作簿名称(字符串),也可以是工作簿的位置序号(正整数)。
(3)range:字符型,读取指定区域的数据,如B3:D87表示读取B3至D87区域的数据。
(4)col_names:逻辑型,判断是否使用第一行作为列名称。
(5)col_type:字符向量或NULL,读取数据每一列的类型,包含skip(忽略)、guess(基于被读取的Excel文件本身的单元格类型)、logical(逻辑型)、numeric(数值型)、date(日期型)、text(字符串型)或list(列表型)等可选参数。
(6)na:字符串,被读取的Excel文件对缺失值的约定。
(7)trim_ws:逻辑型,判断是否清楚数据末尾的空格。
Excel是数据处理中常用的数据存储格式,R语言读取它的途径比较多。建议优先选用readxl包(方便、速度快、无其他限制)和openxlsx包(可读/可写、无其他限制),不建议选用XLConnect包和xlsx包,因为这两个包都是基于Java语言环境的,虽然速度比较快,但是在读写过程中会出现内存和最大读取行数超限等错误。
写入Excel文件
openxlsx::write.xlsx(x = iris, file = "iris_openxlsx.xlsx", asTable = TRUE)
iris3 <- openxlsx::read.xlsx(xlsxFile = "iris_openxlsx.xlsx")
# 验证数据一致性
identical(iris, iris3)
str(iris3)
str(iris)
上述代码运行结果显示,write.xlsx()函数写入的数据集再次读取后,与原数据集存在不一致的现象。分别查看两个数据集的属性后,发现写入数据集,经过再次读取后,在species字段的类型发生了变化,原始数据集中该字段为因字形而写入在读取后,该字段变成了字符型,这段针对字符数数据读写前后的变量类型差别读者在实际应用中应予以注意。
欢迎关注公众号:生信诊断所