生信学习之R语言进阶1--数据的获取与导出(1)

数据获取是任何一款致力于数据分析挖掘工具都必须具备的基础功能。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)
image.png

使用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字段的类型发生了变化,原始数据集中该字段为因字形而写入在读取后,该字段变成了字符型,这段针对字符数数据读写前后的变量类型差别读者在实际应用中应予以注意。

欢迎关注公众号:生信诊断所

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容