主讲老师第四课:文件读取与输出
这里需要掌握怎么把外面的 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