第 4 课

文件读取与输出

课程讲义导读 · 聚焦本课核心概念、分析流程与复现要点

说明:本页适合用于快速回顾本课重点、关键步骤与常用示例。

主讲老师第四课:文件读取与输出

这里需要掌握怎么把外面的 csv 文件,txt 文件读取进来,以及怎么把 R 里面的内容保存成 txt 文件,至于这里面用了 GEO 数据和 TCGA 数据,怎么下载的,怎么整理的,是后面的事情,只是作为个演示。拿到文件(材料.zip)以后,大家把这个文件解压,打开 Rproject 文件点击打开这个 R 代码脚本,学习完了数据类型和数据结构后,就是文件内容的操作,这其中包括了文件的读取与输出两个过程。

1.文件的读取

1.1 R 读取 txt 文件

使用 R 读取 txt 文件直接使用 read.table()方法进行读取即可,不需要加载额外的包。

这里需要注意的一点是,文件名需要写完整,包括文件后缀名.txt。

灵活使用 Tab 建自动补齐~可以看到,在 Environment 中多了一个名为 rt 的变量。点击 rt,查看具体的内容此时的表格,与我们常见的并不一样。目前第一列是 Sample 的 id 名,而第一行为gene 名等信息。因此,我们需要对其中的参数进行调整其中 sep = "\t"表示数据的切分格式,\t 是 txt 文件的默认切分格式,header = T表示第一行作为列名,当然,如果你对数据框的列名不满意,也可以通过参数col.names 来进行重新定义,而 rownames = 1 表示把第一列作为行名,修改相应参数后,重新读取文件。

首先来看下环境变量中两个数据集的变化,可以看到,数据集 rt2 比之前的第一个数据集 rt 少了一行一列,这是因为 txt 文件中的第一行变成了列名,第一列变成了行名。接着,点击 rt2 来看下具体的内容效果。

当然,除了这些参数外,还有一些常用的参数,比如说,参数 stringsAsFactors,其默认值为 TRUE,表示在读取过程中,会自动把数据框中的字符型变量转换成因子型,一般情况下如果不是特殊需要,我们会将其定义为 FALSE,修改参数为stringsAsFactors = FALSE。

对于 txt 文件,使用 read.table()函数,同样,对于 csv 文件,我们可以使用read.csv()函数进行读取,两者的参数是基本一致的,但是,如果说不想将数据保存为 txt 格式和 csv 格式呢?想要快速读取 Excel 文件,也是有相应的办法的。

这里给大家推荐一个 R 包,即 readxl 包接下来,我们可以使用 readxl 包中的 read_excel 函数来读取 Excel 文件而且,独特的一点是,这个函数是没有参数 header 的。

读取进来以后,我们可以看到,其默认第一行就是列名,相当便捷。那么,我们再来看一下其他格式文件的文件读取。比如,最常用的 GEO 数据框,当下载完数据后,如何将其读取进来呢?先试试之前的代码能否完成读取。

但是,系统出现了以下的报错:

表示“第 29 行并没有 2 个元素” 那么,我们用 EXCEL 来打开文件看看,第 29 行是什么 原因?

继续往下看,从第 67 行开始,前面的数据内容和后面的内容格式又不一样。

对此,大家应该也有所熟悉,红色框内的才是表达数据,上方一大串的是各种注释信息。

但是,有一个共同点,第 67 行之前的内容都是以!开头的,作为注释内容,其后的则为芯片的表达数据,这样,我们可以通过增加一个参数来进行读取。

通过参数 comment.char = '!',表示把以!开头的内容作为注释,不进行读取,这样就能顺利读取芯片表达数据。而对于前面注释信息中的临床数据,我们在后期GEO 板块会进行相应的介绍

2.文件的输出

文件有读入,自然也有结果的输出保存,下面,我们来介绍一下如何讲结果输出,可以说,文件的输出是一个比较默认的格式。

设置好需要保存的变量名 rt2,输出的文件名 file = "data.txt",使用 write.table()函数即可快速地将文件保存在工作目录下。在 R 语言里,文件的保存相对还是比较简单的。

R 中更多选择的文件读取方式

1.基本读取函数

学习逻辑我们在 R 中操作的数据常见的格式为 txt、csv、xlxs 格式这些,当然还有很多其它格式,但是这个数据从诞生开始,就一定会有一个 R 包可以读取它,比如说scRNA-seq 的数据就有专门的 Seurat 包可以进行读取和操作,所以这里我们的学习逻辑是——掌握普适规律,后期遇到特殊的则再进行学习read.table()函数适合读取 txt 格式的文件read.table(file, header = FALSE, sep = "", quote = "\"'",dec = ".", numerals = c("allow.loss", "warn.loss", "no.loss"),row.names, col.names, as.is = !stringsAsFactors,na.strings = "NA", colClasses = NA, nrows = -1,skip = 0, check.names = TRUE, fill = !blank.lines.skip,strip.white = FALSE, blank.lines.skip = TRUE,comment.char = "#",allowEscapes = FALSE, flush = FALSE,stringsAsFactors = default.stringsAsFactors(),fileEncoding = "", encoding = "unknown", text, skipNul = FALSE)

主讲老师解读:

以上是这个函数所有的参数,但是不需要掌握这么多,只需要掌握重点的几个即可,下面列出来需要掌握的参数

1.header 参数——如果我们读取的数据有变量名,我们可以设置参数为 TRUE,即

告诉这个函数,我们的文件有变量名,不需要你给我设置变量名

2.sep 参数——数据的分隔符,这里如果我们读取 txt 文件,一般来说是不需要进

行设置的,如果需要设置可以设置一个空格、多个空格、\t、换行符或者回车符等等

3.na.strings 参数——可选的用于表示缺失值的字符向量。na.strings=c("-9","?")

把-9 和?值在读取数据时候转换成 NA

4.stringsAsFactors 参数——逻辑值,标记处字符向量是否需要转化为因子,默

认是 TRUE

5.skip 参数——在读取数据前需要跳过的行数

read.csv()函数适合读取 csv 格式的文件read.csv(file, header = TRUE, sep = ",", quote = "\"",dec = ".", fill = TRUE, comment.char = "", ...)read.csv2(file, header = TRUE, sep = ";", quote = "\"",dec = ",", fill = TRUE, comment.char = "", ...)read.csv()读取逗号分隔文件(常用)read.csv2()读取分号分隔文件

主讲老师解读:

这个函数要和上面的 read.tabel 函数联合起来记忆,基本上两者参数的功能都是相似的,只不过是其参数的名称不同,比如说 read.table 函数中 skip 参数为跳过 XX 行,而 read.csv 函数中 comment.char 参数也执行着类似的功能,为跳过以XX 开头的行总结:上面这两个函数尽管也可以读取不同文件,但是这里建议为了避免报错以及更多的错误,专文件用专门的读取函数

2.readxl 包

上面介绍的是 base 包中的两个读取函数,基本上可以解决我们读取文件中遇到的

80%的问题,但是我们后续还会遇到很多诸如:

1.文件太大,读取速度慢?!

2.Excel 文件如何读取?!

3.不是这几种格式的文件该如何读取?!

这里就可以引入一个专门读取数据的 R 包——readxl 包,readxl 包是 tidyverse中的一员,是导入 Excel 表格数据的一个 R 包,由 Hadley Wickham 开发的这里我们主要解决如何读取表格read_excel(path, sheet = NULL, range = NULL, col_names = TRUE,col_types = NULL, na = "", trim_ws = TRUE, skip = 0,n_max = Inf, guess_max = min(1000, n_max),progress = readxl_progress(), .name_repair = "unique")

主讲老师解读:

要想让一个读取函数运行,其实最简单的配置就是如下read_excel("XX.xls")至此:我们掌握了三种文件的读取形式,下面将介绍更多读取的 R 包

3.读取大文件

如果读取的文件太大,用 read.csv 会非常消耗内存和时间,而使用 data.table 包中多的 fread 函数可以大大节省内存和时间library(data.table)test<-fread("xxx.csv",sep = ",",header = T,na.strings = c("NA"))

主讲老师解读:主要参数如下

提问:我们上面所有的函数读取到 R 中的数据集形式是什么,向量?矩阵?数据框?列表?

回答:数据框

作业:

数据框的英文为 data.frame,这里我们引入一个概念 tibble

1.那么什么是 tibble 呢?

2.又和数据框有什么区别呢?

3.为什么我这里要提及 tibble?

提示:浏览器键入 readr 包

答案这里我们引入 tibble 的是为了引入我们另一个读取数据更加快捷的 R 包——readr 包相比较于基础包的优点

1.读取速度更快;

2.生成 tibble,并且不会把字符向量转换成因子,不使用行名称,也不会随意改

动列名称readr 包是 tidyverse 包的核心包之一read_csv()#读取逗号分隔文件read_csv2()#读取分号分隔文件read_tsv()#读取制表符分隔文件read_delim()#读取使用任意分隔符的文件read_table#可用于替代 read.table(),但是 read.table()支持文件列之间存在不等长空格,read_table()要求列必需对齐;

主讲老师解读:

记住中心原则,读取函数的本质是读取,也就是说你单独键入文件名函数大概率都会运行,然后根据帮助文档细微调节参数足以,好好利用网络资源将会提高你的技巧~tibble 和 data.frame 的区别学习目的首先我们 R 语言处理数据的时候,最常用的数据形式就是 data.frame,但是碰巧的就是,tibble 和 data.frame 又是如此的相似,所以有必要去学习这个类似于data.frame 的进化版本——tibble参考学习链接:Tibbles (r-project.org)Tibble vs data.frames通俗来讲这两者的区别主要体现在——print(输出)和子集的索引上,下面通过代码进行演示,大家可以跟着进行演示Printing(输出)#构建 tibblelibrary(tidyverse)tibble(x = -5:100, y = 123.456 * (3 ^ x))# A tibble: 106 x 2# x y# <int> <dbl>#1 -5 0.508#2 -4 1.52#3 -3 4.57#4 -2 13.7#5 -1 41.2#6 0 123.#7 1 370.#8 2 1111.#9 3 3333.#10 4 10000.# ... with 96 more rows

主讲老师解读:

1.默认情况下,tibble 只展现三位有效数字,尾部的一个点则表示存在一个小数

分量

2.同时往往只展示前 10 行观测的内容,后面则会采取缩写的形式,这样子大大提

高了展示的速度

3.题头展现了数据的行数×列数

4.变量下方展现了该变量下元素的类似

5.没有行名

Subseting(取子集)df1 <- data.frame(x = 1:3, y = 3:1)class(df1[, 1:2])#[1] "data.frame"class(df1[, 1])#[1] "integer"主讲老师解读:可以看出数据框提取里面的元素表现的就不是很严谨~因为这里我提取一列和两列,数据类型居然发生了改变df2 <- tibble(x = 1:3, y = 3:1)class(df2[, 1:2])#> [1] "tbl_df" "tbl" "data.frame"class(df2[, 1])#> [1] "tbl_df" "tbl" "data.frame"主讲老师解读:而 tibble 则十分的严谨,不管提取多少,它的本质是不变的注意:这里并没有说 tibble 比 data.frame 就要高大上很多,这个世界并非是非黑即白,不要用二元论的观点看世界,主张用多元论的方式来看待问题,毕竟data.frame 的使用地方远大于 tibble,这里只是引进一个区别和一个概念~class(df2[[1]])#> [1] "integer"class(df2$x)#> [1] "integer"df <- data.frame(abc = 1)df$a#> [1] 1df2 <- tibble(abc = 1)df2$a#> Warning: Unknown or uninitialised column: `a`.#> NULL

主讲老师解读:

从上面可以看出 tibble 整体来说要比 data.frame 更加严格,而且不支持变量名的部分匹配而且前面也说到 tibble 是不支持行名的,当有行名的数据转换为 tibble 的时候,行名会被移除#建造数据框,行名设置为字母df <- data.frame(a = 1:3, row.names = letters[1:3])rownames(df)#> [1] "a" "b" "c"rownames(as_tibble(df))#> [1] "1" "2" "3"其实大致上来说就是这两种不同,我们不需要深究太多,只需要当我们看到tibble 这个格式的时候不要措手不及就可以,另外稍微留意一下以上两种不同

Ps:这两种差别绝大多数情况下都不会影响到我们的分析过程

Tools Introduction主讲老师 2021年7月8日CONTENTS 1. 笔记类

2. 应用类

3. 学术类

4. 分析类

笔记类A bad pen is better than a good memory笔记类 Typora——高效的编辑软件,抛去复杂的功能,还原最真实的书写感受 支持markdown语法(https://markdown.com.cn/cheat-sheet.html) 方便、快捷、支持多格式导出 onenote——笔记管理软件,相比于Typora不成体系来说,这个软件可以帮助我们更加效率的管理笔记 支持多平台(PC、MAC、手机) 多格式导出 虽然支持markdown语法(不好用),如果想记录语法笔记,建议和Viscode联用 幕布——逻辑导图软件,操作简单 也有在线管理功能 有PC版本和网页版本应用类Science and technology is the primary productive force应用类 Simple History——网页浏览器的历史记录保存栏,可以保存历史浏览记录 便于误删而导致的网页消失 方便、操作简单 沙拉查词——网页翻译插件 准确、颜值高、方便 PubmedPlus——文献插件 影响因子落后是一个缺点 方便和Github联系,下载方便 影响因子的缺点可以通过挑圈联靠公众号或者仙桃工具弥补 重点是支持Chrome浏览器学术类There is no limit to learning and climb new heights bravely学术类 必应——搜索引擎 比百度优秀 没有过多的广告且颜值高 github——代码的天堂 github不光可以获得代码,同时还可以解决报错 代码仓库内的issue,就会有很多提问,还会有作者的回答 推特——ggplot2以及R语言的学习平台 推特有ggplot2打卡活动,有很多美图复现(tidytuesday话题) 不稳定 youtube也有很多R语言绘图教程

分析类

Good tools are efficient

分析类

 R——无出其右的分析工具,因为有众多R包的支持,可视化非常完美 功能丰富 数据处理方面确实有局限 Python——新兴的语言,有望取代perl在生信领域的地位 Python的可视化虽然简陋,但是数据处理方面确实优于R语言 而且有些分析功能只支持Py,比如细胞通讯中的CellPhoneDB的使用就只支持Pyhton Linux——生信领域的三驾马车中最重要的一辆

 上游分析必须要打通的技能

 比较繁琐而且最好有一个自己的服务器练习,当然现在windows10也支持linux内核,可以用ubuntu调用 有时间可以学习,但是一般都是针对下游,业余学习的性价比不高Thanks

← 返回批次1总导航