分享

从 R 绘图入门看 R 语言学习方法论

 健明 2022-04-21

因为一些网络素材引用不规范,我们的这个笔记被网络吞掉了一次。很多朋友在公众号后台催更,还好鲍志炜抽空抢救回来了,不负大家的等待。

下面是鲍志炜的笔记

前几天收到邀请要给一些临床医学生做一期 R 语言绘图的入门教学分享,这可着实让我有些诚惶诚恐,虽然在生信圈里混了几年,但确实没怎么系统地学过 R,这些所谓的 R 语言本事都是靠仅有的 Python 基础支撑,画什么图做什么分析向来奉行的也是「拿来主义」。话虽如此,但我还是接受了这个委托,毕竟在学习编程方面咱还是略有些经验,说不定能帮到一些同学。以下经验仅为个人总结,欢迎补充。

步骤 0:向着目标前进

为什么要学习 R 语言

我一直认为对于临床医学生来说,学习 R 语言是一种性价比极高的提升自我的方式。一方面他足够简单,作为入门级别的编程训练再好不过;另一方面,除了可以帮助我们画出好看的图,完成一些比较复杂的统计分析之外,它还可以进一步培养我们的科研思维,隐形中推动我们进一步学习统计学、生物信息学等整合多层面研究的认知基础。另外,从科研成果的落地实践角度来讲,好的临床数据分析的成果能迅速地在实践中起指导作用,这样也更容易带动大家做研究的兴趣。

大家对 R 语言的抗拒,无非在于习惯了图形化界面,而难以接受以编程的方式来处理数据的方式(不要以没有时间来推脱,一个小时完全足够入门 R 语言)。正如一句老话「一切恐惧源自未知」,我相信等你花上点时间,尝到一些甜头,必然会觉得这一切是如此的自然而然,编程只是一种解决问题的工具,每个人都可以轻松掌握。

在开始之前,定一个小目标

学习面向「科研」的编程,切忌漫无目的,只凭着一腔热血从超过五百页的「好评如潮」的《R 语言实战》开始。并不是说《R 语言实战》或者类似的课程不好,他很好,系统、基础、内容详实,我们确实需要他,但不应该是现在这个时候。

在正式开始学习之前,我的建议是「以目标导向的学习」,我们得首先确定一个努力的「目标」,即你学习 R 语言的目的。没有目的的学习就注定了你要面面俱到,就和背单词书一样,很有可能,过了好几天仍被困在「abandon」的魔咒当中,逐渐失去学习的动力。

这个「目标」不宜过大,我们需要聚焦到一个相对容易实现的「点」上,可以是:

  • 我要用 R 语言画出某一幅好看的图;
  • 我要用 R 语言实现某个生信分析;
  • 我要用 R 语言基于自己的数据进行统计;
  • ...

有了「小目标」我们就可以开始规划自己的「学习路径」,边用边学,在不断实践中逐渐熟练,从中感悟编程的哲学,这才能学的又快又扎实,最后还能享受达成目标的快感。

举个例子,比如,你现在手头上已经有一些数据,想用 R 语言做一些可视化,那么你的学习路径可以是:

学习 R 基本语法 --> 学习 ggplot2 语法 --> 用自己的数据绘图

比如,你想用 R 完成某个生信分析:

学习 R 基本语法 --> 学习相关 R 包(通过文献或其他资料检索而来) --> 用自己的数据分析

规划学习路径的目的在于,少走弯路,用最快的方法达成目的,产生对 R 语言的兴趣,培养自己的信心,以便后续更加深入的学习。

无论我们想要实现哪个「目标」首要的都是要「学习 R 基本语法」,但并不是说什么都学,我觉得只需要学足够你完成分析的部分就行,其他的可以后续查漏补缺(比如多 google,看看《R 语言实战》)。

步骤 1:走出第一步 - 安装软件

真正开始用 R 语言之前,我们需要下载安装包。R 语言一直在不断升级,自 1993 年问世以来已经发布了好几个不同的版本,我们可以从 Comprehensive R Archive Network(CRAN,https://cran./) 下载基于 Linux、 Mac 和 Windows 不同系统的二进制文件。

R 语言安装完成后,我们还需安装 R 语言的综合开发环境(虽然基本的 R 控制台也能工作)。推荐使用:RStudio(https://www./)。

安装的过程我就不赘述了,一直点「下一步」就行。

注意

  1. 安装好 R 之后,再安装 RStudio;
  2. Windows 系统请将软件全部安装在 C 盘的默认位置,否则程序将可能无法更新或运行。

熟悉 RStudio 界面

详见 cheatsheet

界面一般分为四个窗口, 包括代码编辑窗口、变量浏览窗口、命令执行窗口(控制台(Console))、文件管理窗口。

你必须知道的小技巧

1. 以项目的方式管理代码

从功能上讲,在 RStudio 中创建一个项目,其实就是创建一个新的文件夹并将其定义为工作目录,这样生成的所有文件将被放在这个目录中。当你重新打开一个项目(以 .Rproj 为后缀)时,RStudio 会记得打开了哪些文件,并将恢复工作环境。

如何创建 Project

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./books/r-in-action/ ,有中文纸质书《R语言实战》);
  • 有了 R 语言基础之后,Advanced R(免费书,http://adv-r./ ,有中文纸质书《高级R语言编程指南》)会让你的 R 技能更上一层楼。

步骤 3:勇敢做调包侠

业内有一句名言「不要重复造轮子」。说得是已经有过实现这个功能的代码,我们就不要重复去造,直接用别人的代码就好。从「实用主义」来说这句话是合理的,新手小白拿来用就行(我的意思是在你希望「进阶」 R 语言的时候,应当是鼓励重复造轮子的,照葫芦画瓢是「进阶」的最好方式之一)。

R 语言如此流行的原因之一即是因为有成千上万的 R 包供我们调用。所谓 R packages 就是一组用于特定目的代码,以便被其他开发人员重复使用。除了主代码库之外,程序包通常还包括文档和测试数据(一般越好的 R 包补充材料会越详细)。我们可以轻松下载特定的软件包,并使用他们的功能。每个人都可以开发 R 包,也可以与他人共享 R 包。

目前,R包主要来源于三个平台。

  1. CRAN 存储了 R 最新版本的代码和文档的服务器 (https://cran./)
  2. 生物信息学领域的 Bioconductor 平台,它提供的R包主要为基因组数据分析和注释工具 **(https:///)**。
  3. 面向开源及私有软件的第三方平台 -- Github。R 包的作者更愿意将其存储在该平台,因此很多时候需要在上面下载 **(https://github.com/)**。
现在有多少 R 包
  • CRAN:18668
  • Bioconductor:2083
  • Rforge:2149
  • Github:不计其数……

也就是说,大多数情况下你不需要自己从头实现算法,也可以轻松进行分析或可视化。

安装 CRAN 上的程序包

这里举的例子是三个有名的神包。用于绘图的 ggplot2 包,可以把 R生成的图片导出为ppt 可编辑格式的 export 包(实不相瞒,很多时候我都是先用 ggplot2 画图,再导出为 PPT 改一改细节)以及用于数据分析的 tidyverse。

install.packages("ggplot2")
# 安装一个
install.packages(c("ggplot2""export"))
# 安装多个
install.packages("tidyverse",dependencies = TRUE)
# 安装一系列,并安装所有依赖的程序包

安装 Bioconductor 上的程序包

这里的例子是大名鼎鼎的 ggtree 包,一个功能强大的系统发育树可视化及注释 R 语言软件包。

if (!requireNamespace("BiocManager",
quietly = TRUE))
install.packages("BiocManager")
BiocManager::install("ggtree")

安装 Github 上的程序包

GitHub 上也有很多有意思的包,比如用于绘制基因组的共线性区域的 gggenomes 包:

library(devtools)
install_github("thackl/thacklr")
install_github("thackl/gggenomes")

如果还没有安装 devtools,则输入:

install.packages("devtools")

步骤 4:学习 R 语言绘图

有了以上的 R 语言基础以后,我们就可以根据自己感兴趣的方向进行深入探索啦!

虽然我们的目标是学习 R 绘图,但学习数据分析的一整套流程是必不可少的,我认为是磨刀不误砍柴工,绝大多数时间我们都是在进行数据的整理和分析,而不在于数据的可视化。

数据分析流程

一套完整的数据分析流程包含以下几个方面:

  1. 导入(Import)数据。
  2. 数据整理(Tidy):将数据整理成R可识别的格式,整理好的数据形式:每列是一个变量,每行是一个观测。
  3. 数据转换(Transform):将数据转换成分析直接需要的数据,即数据的二次加工,如选出感兴趣的行、创建新的列、计算一些统计量(如计数或平均值)等。
  4. 数据可视化(Visualise)
  5. 建立模型(Model)
  6. 沟通(Communicate):对数据理解透彻后,我们需要与他人交流分析结果。

Tidyverse 家族

提到数据分析流程,就不得不学习下 Tidyverse 家族,其包含了一系列 R 包来完成数据分析流程中的各个步骤:

tidyverse 主要成员包括:

  1. readrreadxlhaven:读取数据
  2. dplyrtidyrdbplyr, dtplyr:整理和查询数据
  3. stringr:处理字符串
  4. ggplot2:绘图
  5. lubridate:处理日期和时间
  6. purrr:处理list 有关的计算
  7. broom:将建模的结果转换为 data.frame
  8. forcats:处理因子类型的向量

此部分内容强烈建议跟随 R for Data Science(免费书,Welcome | R for Data Science (),有中文纸质书《R数据科学》)这本书一起学习,本书的作者即是 tidyverse 家族的开发者 Hadley Wickham,他也是 RStudio 首席科学家。这本书将教会我们如何用 R 来进行数据分析,同时为之后的科研工作培养一个好习惯。

步骤 5:从 copy 中学习 R 语言绘图

在最开头我提到学习 R 绘图按部就班的学习路径就是:

学习 R 基本语法和编程逻辑 --> 学习 ggplot2 基本语法和编程逻辑 --> 用自己的数据绘图 --> 调整代码不断修改

但现实是,很多临床的同学并没有这么多时间仔细调整每一行代码,研究每一个参数,最后做出一副比较 fancy 的科研绘图。这也是有捷径的,现在网上有太多大佬分享可复现的且容易上手的 R 绘图代码,而且很多 R 包的官方文档都非常详细,这也为我们提供了可供参考的范例。从「实用主义」来说,大家尽可以选择直接 copy 这些代码,从而更快地达成自己的目的:

学习 R 基本语法和编程逻辑 --> 学习 ggplot2 基本语法和编程逻辑 -->  copy 代码 --> 套自己的数据绘图 --> 调整代码不断修改

用了别人的代码记得在文章中加上一句致谢或引用,这是基本的美德。

事实上,copy 只在第一层,你只是学会了「如何快速使用 R 绘图」,并没有做到「如何快速学会 R 绘图」,更重要的点是在于套自己数据的过程中,学习别人写代码的逻辑和习惯,思考每一行代码背后的用处,及时做好笔记和注释,最好能发散思维、举一反三,「多用、多想」才是精髓。另一方面来说,这些可供 copy 的代码其实也是一种参考答案,很多时候你可以盖住答案,用自己的方式重写代码,复现图表,在实践中不断刻意地训练自己,以此精进。

学习 R 基本语法 --> 学习 ggplot2 基本语法 -->  copy 代码 --> 用自己的数据绘图 --> 学习其中的代码逻辑,多画图

步骤 6:学会解决问题

学会自己解决问题

刚刚我提到「多用、多想」是学会 R 语言的捷径,但还有一个不可忽视的「捷径」就是「多问」,这里的「问」,我觉得比起问他人,更重要的是「问自己」。90% 的问题完全可以靠自己去解决,「学会自己解决问题」也是研究生训练中重要的一课。

查看帮助文档

在 R 语言内,我们可以使用内置的帮助系统。例如,?plot 命令查看绘图功能的文档。或者使用 RStudio 右下角的 Help

学会使用搜索引擎

你能碰到的问题,大多数情况下已经有人碰到过一样的问题。如果使用帮助文档不能很好地解决疑问,那么搜索引擎将是接下来的不二之选。

以谷歌为例,它的搜索能力强大,定位精准,不仅可以完美捕捉 R 社区里的相关解答,还会搜寻出其他各类形式、各种来源的辅助学习材料,让我们有机会深入了解问题的来龙去脉,而不仅仅是获得一个答案。一般来说,在直接检索你的报错信息 +  R 关键词就可以找到答案,尽量用英文查询。

Stack Overflow(http:///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

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多