因为一些网络素材引用不规范,我们的这个笔记被网络吞掉了一次。很多朋友在公众号后台催更,还好鲍志炜抽空抢救回来了,不负大家的等待。
下面是鲍志炜的笔记
前几天收到邀请要给一些临床医学生做一期 R 语言绘图的入门教学分享,这可着实让我有些诚惶诚恐,虽然在生信圈里混了几年,但确实没怎么系统地学过 R,这些所谓的 R 语言本事都是靠仅有的 Python 基础支撑,画什么图做什么分析向来奉行的也是「拿来主义」。话虽如此,但我还是接受了这个委托,毕竟在学习编程方面咱还是略有些经验,说不定能帮到一些同学。以下经验仅为个人总结,欢迎补充。
步骤 0:向着目标前进
为什么要学习 R 语言
我一直认为对于临床医学生来说,学习 R 语言是一种性价比极高的提升自我的方式。一方面他足够简单,作为入门级别的编程训练再好不过;另一方面,除了可以帮助我们画出好看的图,完成一些比较复杂的统计分析之外,它还可以进一步培养我们的科研思维,隐形中推动我们进一步学习统计学、生物信息学等整合多层面研究的认知基础。另外,从科研成果的落地实践角度来讲,好的临床数据分析的成果能迅速地在实践中起指导作用,这样也更容易带动大家做研究的兴趣。
大家对 R 语言的抗拒,无非在于习惯了图形化界面,而难以接受以编程的方式来处理数据的方式(不要以没有时间来推脱,一个小时完全足够入门 R 语言)。正如一句老话「一切恐惧源自未知」,我相信等你花上点时间,尝到一些甜头,必然会觉得这一切是如此的自然而然,编程只是一种解决问题的工具,每个人都可以轻松掌握。
在开始之前,定一个小目标
学习面向「科研」的编程,切忌漫无目的,只凭着一腔热血从超过五百页的「好评如潮」的《R 语言实战》开始。并不是说《R 语言实战》或者类似的课程不好,他很好,系统、基础、内容详实,我们确实需要他,但不应该是现在这个时候。
在正式开始学习之前,我的建议是「以目标导向的学习」,我们得首先确定一个努力的「目标」,即你学习 R 语言的目的。没有目的的学习就注定了你要面面俱到,就和背单词书一样,很有可能,过了好几天仍被困在「abandon」的魔咒当中,逐渐失去学习的动力。
这个「目标」不宜过大,我们需要聚焦到一个相对容易实现的「点」上,可以是:
- 我要用 R 语言画出某一幅好看的图;
- 我要用 R 语言实现某个生信分析;
- 我要用 R 语言基于自己的数据进行统计;
- ...
有了「小目标」我们就可以开始规划自己的「学习路径」,边用边学,在不断实践中逐渐熟练,从中感悟编程的哲学,这才能学的又快又扎实,最后还能享受达成目标的快感。
举个例子,比如,你现在手头上已经有一些数据,想用 R 语言做一些可视化,那么你的学习路径可以是:
代码语言:javascript复制学习 R 基本语法 --> 学习 ggplot2 语法 --> 用自己的数据绘图
比如,你想用 R 完成某个生信分析:
代码语言:javascript复制学习 R 基本语法 --> 学习相关 R 包(通过文献或其他资料检索而来) --> 用自己的数据分析
规划学习路径的目的在于,少走弯路,用最快的方法达成目的,产生对 R 语言的兴趣,培养自己的信心,以便后续更加深入的学习。
无论我们想要实现哪个「目标」首要的都是要「学习 R 基本语法」,但并不是说什么都学,我觉得只需要学足够你完成分析的部分就行,其他的可以后续查漏补缺(比如多 google,看看《R 语言实战》)。
步骤 1:走出第一步 - 安装软件
真正开始用 R 语言之前,我们需要下载安装包。R 语言一直在不断升级,自 1993 年问世以来已经发布了好几个不同的版本,我们可以从 Comprehensive R Archive Network(CRAN,https://cran.r-project.org/) 下载基于 Linux、 Mac 和 Windows 不同系统的二进制文件。
R 语言安装完成后,我们还需安装 R 语言的综合开发环境(虽然基本的 R 控制台也能工作)。推荐使用:RStudio(https://www.rstudio.com/)。
安装的过程我就不赘述了,一直点「下一步」就行。
注意
- 安装好 R 之后,再安装 RStudio;
- Windows 系统请将软件全部安装在 C 盘的默认位置,否则程序将可能无法更新或运行。
熟悉 RStudio 界面
详见 cheatsheet
界面一般分为四个窗口, 包括代码编辑窗口、变量浏览窗口、命令执行窗口(控制台(Console))、文件管理窗口。
你必须知道的小技巧
1. 以项目的方式管理代码
从功能上讲,在 RStudio 中创建一个项目,其实就是创建一个新的文件夹并将其定义为工作目录,这样生成的所有文件将被放在这个目录中。当你重新打开一个项目(以 .Rproj
为后缀)时,RStudio 会记得打开了哪些文件,并将恢复工作环境。
如何创建 Project
代码语言:javascript复制RStudio --> File --> New Project
2. 善用 Tab 键补全
RStudio支持用 Tab 键来完成代码的自动补全。例如:如果你键入sub,按下 Tab,你将看到如下:
3. 检索之前使用的命令
我们经常会需要重复执行之前已经进行过的命令,RStudio 控制台支持检索之前执行过代码的功能:
- 方向键↑:向上翻找历史命令
- 方向键↓ :返回翻找
4. 勤看帮助文档
我们可以使用内置的帮助系统查阅使用指南(RStudio 右下角的 Help 窗口),绝大多数问题参考帮助就可以解决。
步骤 2:理解 R 语言基本语法
做好了基本的准备后,我们就可以正式开始学习 R 语言了。以下教程挑一个学即可,建议是以课程为主,R in Action 做补充,半天应该可以学完。
推荐课程(二选一):
- DataCamp 免费的 R 语言入门课程和 R 语言中级课程。你可以根据自己的节奏,在浏览器上交互式学习 R 语言编程;
swril
包内置离线互动的 R 语言入门教程。
推荐书籍:
- R in Action(免费书,https://www.manning.com/books/r-in-action/ ,有中文纸质书《R语言实战》);
- 有了 R 语言基础之后,Advanced R(免费书,http://adv-r.had.co.nz/ ,有中文纸质书《高级R语言编程指南》)会让你的 R 技能更上一层楼。
步骤 3:勇敢做调包侠
业内有一句名言「不要重复造轮子」。说得是已经有过实现这个功能的代码,我们就不要重复去造,直接用别人的代码就好。从「实用主义」来说这句话是合理的,新手小白拿来用就行(我的意思是在你希望「进阶」 R 语言的时候,应当是鼓励重复造轮子的,照葫芦画瓢是「进阶」的最好方式之一)。
R 语言如此流行的原因之一即是因为有成千上万的 R 包供我们调用。所谓 R packages 就是一组用于特定目的代码,以便被其他开发人员重复使用。除了主代码库之外,程序包通常还包括文档和测试数据(一般越好的 R 包补充材料会越详细)。我们可以轻松下载特定的软件包,并使用他们的功能。每个人都可以开发 R 包,也可以与他人共享 R 包。
目前,R包主要来源于三个平台。
- CRAN 存储了 R 最新版本的代码和文档的服务器 (https://cran.r-project.org/)
- 生物信息学领域的 Bioconductor 平台,它提供的R包主要为基因组数据分析和注释工具 **(https://bioconductor.org/)**。
- 面向开源及私有软件的第三方平台 -- Github。R 包的作者更愿意将其存储在该平台,因此很多时候需要在上面下载 **(https://github.com/)**。
现在有多少 R 包
- CRAN:18668
- Bioconductor:2083
- Rforge:2149
- Github:不计其数……
也就是说,大多数情况下你不需要自己从头实现算法,也可以轻松进行分析或可视化。
安装 CRAN 上的程序包
这里举的例子是三个有名的神包。用于绘图的 ggplot2 包,可以把 R生成的图片导出为ppt 可编辑格式的 export 包(实不相瞒,很多时候我都是先用 ggplot2 画图,再导出为 PPT 改一改细节)以及用于数据分析的 tidyverse。
代码语言:javascript复制install.packages("ggplot2")
# 安装一个
install.packages(c("ggplot2", "export"))
# 安装多个
install.packages("tidyverse",dependencies = TRUE)
# 安装一系列,并安装所有依赖的程序包
安装 Bioconductor 上的程序包
这里的例子是大名鼎鼎的 ggtree 包,一个功能强大的系统发育树可视化及注释 R 语言软件包。
代码语言:javascript复制if (!requireNamespace("BiocManager",
quietly = TRUE))
install.packages("BiocManager")
BiocManager::install("ggtree")
安装 Github 上的程序包
GitHub 上也有很多有意思的包,比如用于绘制基因组的共线性区域的 gggenomes 包:
代码语言:javascript复制library(devtools)
install_github("thackl/thacklr")
install_github("thackl/gggenomes")
如果还没有安装 devtools,则输入:
代码语言:javascript复制install.packages("devtools")
步骤 4:学习 R 语言绘图
有了以上的 R 语言基础以后,我们就可以根据自己感兴趣的方向进行深入探索啦!
虽然我们的目标是学习 R 绘图,但学习数据分析的一整套流程是必不可少的,我认为是磨刀不误砍柴工,绝大多数时间我们都是在进行数据的整理和分析,而不在于数据的可视化。
数据分析流程
一套完整的数据分析流程包含以下几个方面:
- 导入(Import)数据。
- 数据整理(Tidy):将数据整理成R可识别的格式,整理好的数据形式:每列是一个变量,每行是一个观测。
- 数据转换(Transform):将数据转换成分析直接需要的数据,即数据的二次加工,如选出感兴趣的行、创建新的列、计算一些统计量(如计数或平均值)等。
- 数据可视化(Visualise)。
- 建立模型(Model)。
- 沟通(Communicate):对数据理解透彻后,我们需要与他人交流分析结果。
Tidyverse 家族
提到数据分析流程,就不得不学习下 Tidyverse 家族,其包含了一系列 R 包来完成数据分析流程中的各个步骤:
tidyverse 主要成员包括:
readr
、readxl
、haven
:读取数据dplyr
、tidyr
、dbplyr
,dtplyr
:整理和查询数据stringr
:处理字符串ggplot2
:绘图lubridate
:处理日期和时间purrr
:处理list 有关的计算broom
:将建模的结果转换为 data.frameforcats
:处理因子类型的向量
此部分内容强烈建议跟随 R for Data Science(免费书,Welcome | R for Data Science (had.co.nz),有中文纸质书《R数据科学》)这本书一起学习,本书的作者即是 tidyverse 家族的开发者 Hadley Wickham,他也是 RStudio 首席科学家。这本书将教会我们如何用 R 来进行数据分析,同时为之后的科研工作培养一个好习惯。
步骤 5:从 copy 中学习 R 语言绘图
在最开头我提到学习 R 绘图按部就班的学习路径就是:
代码语言:javascript复制学习 R 基本语法和编程逻辑 --> 学习 ggplot2 基本语法和编程逻辑 --> 用自己的数据绘图 --> 调整代码不断修改
但现实是,很多临床的同学并没有这么多时间仔细调整每一行代码,研究每一个参数,最后做出一副比较 fancy 的科研绘图。这也是有捷径的,现在网上有太多大佬分享可复现的且容易上手的 R 绘图代码,而且很多 R 包的官方文档都非常详细,这也为我们提供了可供参考的范例。从「实用主义」来说,大家尽可以选择直接 copy 这些代码,从而更快地达成自己的目的:
代码语言:javascript复制学习 R 基本语法和编程逻辑 --> 学习 ggplot2 基本语法和编程逻辑 --> copy 代码 --> 套自己的数据绘图 --> 调整代码不断修改
用了别人的代码记得在文章中加上一句致谢或引用,这是基本的美德。
事实上,copy 只在第一层,你只是学会了「如何快速使用 R 绘图」,并没有做到「如何快速学会 R 绘图」,更重要的点是在于套自己数据的过程中,学习别人写代码的逻辑和习惯,思考每一行代码背后的用处,及时做好笔记和注释,最好能发散思维、举一反三,「多用、多想」才是精髓。另一方面来说,这些可供 copy 的代码其实也是一种参考答案,很多时候你可以盖住答案,用自己的方式重写代码,复现图表,在实践中不断刻意地训练自己,以此精进。
代码语言:javascript复制学习 R 基本语法 --> 学习 ggplot2 基本语法 --> copy 代码 --> 用自己的数据绘图 --> 学习其中的代码逻辑,多画图
步骤 6:学会解决问题
学会自己解决问题
刚刚我提到「多用、多想」是学会 R 语言的捷径,但还有一个不可忽视的「捷径」就是「多问」,这里的「问」,我觉得比起问他人,更重要的是「问自己」。90% 的问题完全可以靠自己去解决,「学会自己解决问题」也是研究生训练中重要的一课。
查看帮助文档
在 R 语言内,我们可以使用内置的帮助系统。例如,?plot
命令查看绘图功能的文档。或者使用 RStudio 右下角的 Help
学会使用搜索引擎
你能碰到的问题,大多数情况下已经有人碰到过一样的问题。如果使用帮助文档不能很好地解决疑问,那么搜索引擎将是接下来的不二之选。
以谷歌为例,它的搜索能力强大,定位精准,不仅可以完美捕捉 R 社区里的相关解答,还会搜寻出其他各类形式、各种来源的辅助学习材料,让我们有机会深入了解问题的来龙去脉,而不仅仅是获得一个答案。一般来说,在直接检索你的报错信息 R 关键词就可以找到答案,尽量用英文查询。
Stack Overflow(http://stackoverflow.com/questions/tagged/r) 就是一个非常好的编程问答社区,它可以找到常见的 R 语言问题答案。
学会向别人提问
要是你进行了诸多尝试,仍然没办法自己解决问题,那这个时候也只能被迫当伸手党了,但在提问之前,我希望你知道:
一个优秀的提问,他可以指引被提问对象说出关键的信息,并且循序渐进的做出需要的补充内容。如果没有提问者详细的描述和认真的思考,可能这个问题不知道还要经历多少个来回才能被讨论清楚。-- via 思考问题的熊
从我自己来讲,无意义的提问,我一般是懒得回答的。不要埋怨这个世界上高手都傲慢,事实上,很多高手并不傲慢,只是对那些懒于动脑的「伸手党」才傲慢。所以要先自己做好充足的搜索功课,既尊重了别人的时间,又会让你在搜索过程中不断明确自己的问题细节,自学能力得到提升。
关于如何提问也有很多技巧,如果想要更高水平地提问,不妨读一读这本书《提问的智慧》,专门介绍了在网络时代,如何聪明地求助才能让高手愿意回答你。
步骤 7:成为 R 语言大师
相信完成了以上这几步,你已经可以算是叩开了 R 语言的大门。和学习自然语言一样,学习编程语言也是一个长期的过程,由点到面,循序渐进,孰能生巧,相信你终会成为 R 语言大师!
番外 | 用 R 进行实验记录
不管是模型、可视化图像还是其他,最好的记录方式就是用动态文档。R Markdown 是一个相当厉害的工具,它利用可重现的方式报告你的数据分析结果,并且可以存为各种形式的文档:html,word,pdf,ioslides 等等。
参考教程:
- Reporting with R Markdown;
- CHEAT SHEET。
番外 | 统计学
如果你是统计学小白,强烈建议你看一看 StatQuest 系列视频教程,这会帮助你了解在使用 R 时需要的基本概念~
bilibili 上的中文搬运:https://space.bilibili.com/1309928900/video
番外 | 生物信息学
Bioconductor 仓库中的 workflow 也是非常值得一试的实战教程,教你如何用 R 完成形形色色的生物信息学组学分析:
随便点击其中一个,如 RNAseq123,打开是这样的:
Reference
- 生信分析人员如何系统入门R(2019更新版)
- R语言学习入门导航-特别版
- R入门?从Tidyverse学起!
- R语言数据实战 | 获取R帮助文档
- 咱也不知道咱也不敢问?是不会问