写在开头:R提供了各种具有分析数据与强大作图功能的工具包。对于没有计算背景出身的生物学家来说,相比于各种复杂的编程语言,如java、C语言等,R语言是非常友好的,R语言的语法相对简单,容易上手,尤其是对于统计分析和数据处理任务。初学者可以快速编写和运行数据分析代码,而无需掌握复杂的编程概念。
R语言内置了大量的统计函数和数据处理函数,用户可以直接调用这些函数来完成各种分析任务,而无需编写大量的代码。其次R语言有一个庞大且活跃的用户社区,贡献了大量的扩展包,提供了丰富的文档、教程和示例代码。R语言通常在交互式环境(如RStudio)中使用,允许用户逐步运行代码、查看结果并进行调整。这种交互式编程方式非常适合数据分析和探索性研究。
首先R的下载和安装
可以选用清华镜像来下载R(The Comprehensive R Archive Network (tsinghua.edu.cn)),根据自己的操作系统选择对应的链接,下载安装包安装即可。
RStudio是为R语言设计的集成开发环境(IDE),提供了一个图形化用户界面,使得用户编写、调试和运行R代码更加方便。
然后安装Rstudio
打开RStudio安装包官网下载网址:https://www.rstudio.com/products/rstudio/download/
下载RStudio Desktop Free版本,然后安装即可
我还是主要根据数据分析实战过程中应用到的R语言基础进行讲解。
首先R的使用很大程度是借助各种各样的R包,R包相当于R的插件,不同的插件满足不同的需求。我们首先需要安装包才可以使用。
方法一:install.packages(),使用其安装R包,它会自动连接CRAN镜像(Comprehensive R Archive Network存储了数千个软件包,还提供了大量的文档和教程,帮助用户理解和使用R包),并根据R版本选择合适的R包下载安装,同时会解决包之间的依赖关系,例如install.packages("ggplot2")
方法二:Bioconductor 是一个专门用于生物信息学研究的开源软件项目,提供了一套强大的工具包,用于处理和分析高通量数据。Bioconductor 项目下的 R 包主要通过 BiocManager 进行安装和管理
#首先安装BiocManager
install.packages("BiocManager")
#然后使用它安装Bioconductor中的包
BiocManager::install("DESeq2")
方法三:从 GitHub 上安装 R 包。开发者通常在 GitHub 上托管最新的R包版本,这些版本可能包含最新的功能和修复,但尚未发布到 CRAN。从 GitHub 上安装 R 包可以使用 devtools 或 remotes 包。devtools:功能更全面,适用于R包的整个开发过程,包含创建、测试、文档生成和发布R包的功能,对开发者特别有用。remotes:专注于从远程存储库安装R包。更轻量级,适合只需要安装包而不需要完整开发工具的用户。适用于安装包的特定版本或从非CRAN来源安装包。
#首先安装devtools包
install.packages("devtools")
#假设要安装的 R 包位于 GitHub 上的用户名 username 和仓库名 reponame
devtools::install_github("username/reponame")
devtools::install_github("YuLab-SMU/enrichplot")
#查看包的安装路径
./libPath()
#设置临时的包安装路径,每次加载包或安装包前都需重新设置
.libPaths(c("/home/seurat_v5/", .libPaths()))
#手动设置包的安装路径,这样可以在不同的路径下安装不同版本的R包,从而避免包版本冲突
install.packages('Matrix',lib = "/home/seurat_v5/")
分析之前先设置工作目录
#显示工作目录
getwd()
#设置工作目录
setwd('/home/RNA-seq')
#加载包
library(DESeq2)
library(pheatmap)
library(ggplot2)
以bulk转录组数据为例,读取上游分析生成的基因表达矩阵,
#默认读取以","分割的文件,header默认值为TRUE,表示第一行是列名。
countdata <- read.csv("/home/RNA-seq/repeat_analysis/stringtie/gene_count_matrix.csv",row.name="gene_id",header = TRUE)
#read.table函数是R语言中用于读取文本文件的通用函数,适用于各种分隔符的文件。它功能强大,参数灵活,可以处理复杂的数据文件格式。
#sep指定分隔符,默认是空格;row.names指定行名,na.strings指定哪些字符串表示缺失值,默认值为"NA",header同上
countdata <- read.table("/home/RNA-seq/repeat_analysis/stringtie/gene_count_matrix.csv",sep = ",",row.names="gene_id")
使用write函数将结果写入文件
#写入的数据结构主要为矩阵和数据框。sep默认为空格;row.names是否写入行名,默认值为TRUE。quote = FALSE,字符型或因子型数据不会被加上引号
write.table(res1_Enew,file = "res1_Enew.xlsx",quote = F,row.names = T)
我接下来介绍一下R语言的数据结构
常用数据类型分为:数值型,可用于计算加减乘除;字符串型,可进行连接、转换和提取等,字符串型数据需要用引号来说明,如 "hello, world";逻辑型,F或T;日期型等。
R对象:是赋值给变量的任何事物,包括常量、函数、图形等
R对象的数据结构(重要):向量、矩阵、数组、列表、数据框、因子
向量:用于存储数值型、字符型、逻辑型数据的一维数组。使用c()函数创建向量,用<-和=来赋值
x <- c(1,2,3,4,5,6)
group <- c("C","E")
y <- c(FALSE, TRUE, FALSE)
#使用索引访问向量
x[c(1,3)] #输出1,3
x[-1] #负整数索引,返回除了1以外的所有元素
x[c(T,T,F,F,F,F)] #逻辑向量索引,返回1,2
#删除向量中的元素
x <- x[-c(1,3)]
#修改向量中的元素
x[6] <-12
#在指定位置添加数据(x参数指定向量,values是添加的数据,after是添加位置的索引)
x <- append(x=a,values=20,after=4) #输出1,2,3,4,20,5,6
#向量进行逻辑运算
x>5 #返回F,F,F,T
x <- c(1,2,3,4,5,6)
z<-c(4,5,6,1,2,3)
x>z #每个元素一一对比
x %in% z #左边的所有元素是否在右边的对象中,返回T,T,T,F,T,T
#向量运算函数,mean求均值,sd求标准差、var求方差、quantile求四分位数、seq函数构建任意差值等差数列、...
abs(x) #返回向量的绝对值
sum(x) #求和
range(x) #返回最大值和最小值
max(x) #求最大值,min(x)求最小值
median(x) #求中值
round(a,2) #保留两位小数
log(16,base=2) #求对数
矩阵:矩阵是二维的向量,有行列,可以是数值型、字符型、逻辑型,但一个矩阵中只能有一种数据类型。使用matrix函数创建
x<-c(1:20) #x为1到20
#构建4行5列的矩阵,按行排列
m <- matrix(x,nrow=4,ncol=5, byrow=TRUE)
rname <- c("r1","r2","r3","r4")
cname <-c("c1","c2","c3","c4","c5")
#dimnames函数定义矩阵的行名和列名
dimnames(m) <- list(rname,cname)
#dim函数显示维数
dim(m) #返回4 5
#为向量x添加维数,创建一个4行5列的二维数组(矩阵)
dim(x) <-c(4,5)
#通过索引访问矩阵元素。也可以用元素的名称来访问
m[1,2] #访问第一行,第二列,返回2
m[1,] #访问第一行
#矩阵计算
m+m #对应位置的元素相加
n <- matrix(1:20,5,4)
m+n #n是5行4列,m是4行5列,行列数目不同,无法计算
t(m) #矩阵行列转置
数组:多维的矩阵,array()函数创建数组
#用1到24创建2行3列4组的三维数组
z <- array(1:24,c(2,3,4))
列表:一些对象的有序结合,可以存储多个向量、矩阵、数据框、列表的组合,它可以包含多种任何类型的数据。使用list函数创建列表
x<-c(1:20)
m <- matrix(m,4,5)
b <- "character"
list <- list(1=x,2=m,3=b)
#索引访问
list[1] #访问向量x,输出的是一个子集列表
#使用元素访问
list[c("1")] #访问向量x
list$1 #同上
#双括号输出数据本身
list[[]]
数据框:数据框由行和列组成,其中每列可以包含不同类型的数据(如数值、字符、因子等),但同一列中的数据类型必须相同。用dataframe函数创建数据框
df <- data.frame(
name = c("Alice", "Bob", "Charlie"),
age = c(25, 30, 35),
gender = c("F", "M", "M")
)
#同样可以通过索引、元素名称来访问
因子:Factor是一种用于表示分类数据的数据类型。因子是一种特殊的向量,通常用于存储类别(分类)数据和有序数据,例如性别、等级、地区等。因子的一个重要特性是,它们不仅存储了数据本身,还存储了数据的分类水平(levels)。使用factor函数创建
#level指定因子水平
group <- factor("C","C","C","E","E","E",level=c("C",'E"))
#order指定有序向量的顺序
satisfaction <- factor(c("Low", "Medium", "High", "Medium", "Low"),
levels = c("Low", "Medium", "High"),
ordered = TRUE)
字符串:字符串(String)是一种用于表示文本的数据类型。字符串是由一系列字符组成的,可以包括字母、数字、标点符号和其他特殊字符。支持正则表达式处理字符串。R使用单引号(')或双引号(") 来创建字符串
str1 <- "Hello, world!"
#字符串的基本操作
#连接字符串
str2 <- paste("Hello", "world", sep = ", ")
# 获取字符串长度
len <- nchar(str1)
# 提取子字符串
substr_str <- substr(str1, 1, 5) #返回Hello
# 拆分字符串
split_str <- strsplit(str1, ", ")
#替换字符串
#sub 函数只替换第一次出现的匹配,而 gsub 函数会替换所有匹配的部分
#pattern:要匹配的正则表达式模式。replacement:用于替换的字符串。x:输入的字符串向量。ignore.case:是否忽略大小写,默认为 FALSE。fixed:默认为 FALSE,支持正则表达式。gsub函数用法一样
sub(pattern, replacement, x, ignore.case = FALSE, fixed = FALSE)
dates <- c("12/31/2023", "31-12-2023", "2023.12.31")
#sub 函数替换第一个匹配的日期格式,将其转换为 YYYY-MM-DD。gsub 函数替换所有匹配的日期格式,将它们统一转换为 YYYY-MM-DD
#(\\d{2}):\\d:匹配任何数字字符(0-9)。{2}表示前面的匹配应当出现两次,即匹配两位数字。()圆括号用于捕获匹配的内容,形成第一个捕获组group 1;[/-]:[]表示字符类,匹配方括号中的任意一个字符。/ 和 -:在字符类中表示匹配斜杠 / 或横杠 -。(\\d{2}):再次匹配两位数字,形成第二个捕获组group2。替换模式 \\3-\\1-\\2:将匹配的内容重新排列成 YYYY-MM-DD 的格式,使用了反向引用,通过 \\ 加上捕获组的编号来引用捕获的内容。
pattern <- "(\\d{2})[/-](\\d{2})[/-](\\d{4})"
replacement <- "\\3-\\1-\\2"# 定义正则表达式和替换模式
result_sub <- sub(pattern, replacement, dates)
#grep函数用于查找字符串
#value:是否返回匹配的字符串而不是索引,默认为 FALSE。invert:是否返回不匹配的索引或值,默认为 FALSE
grep(pattern, x, ignore.case = FALSE, value = FALSE, fixed = FALSE, invert = FALSE)
#输出R对象的结构
str(c(123))
#返回 num [1:3] 1 2 3
#class()函数用于获取对象的类型。
class(123) #返回numeric
Rstudio使用技巧
Rstudio换源:Tools----> Global Options ------> Package Managment,换源即可
Ctrl + Enter:执行光标所在代码行
Ctrl + Shift +C:代码注释或解除注释
Ctrl + L:控制台清屏
长代码分块:#####前后5个#号#####
如何为对象起名:R处理的所有数据、变量、结果都以R对象的形式保存。注意需要区分大小写;不能用数字作为变量,对象也不能用数字开头,但是数字可以放在中间或结尾;建议不要用过短的名称,可以用"_"等作为间隔;不要使用保留字(是R语言中已经被赋予特定意义的一些单词,如NA缺失值)