专栏名称: 生信菜鸟团
生信菜鸟团荣誉归来,让所有想分析生物信息学数据的小伙伴找到归属,你值得拥有!
目录
相关文章推荐
BioArt  ·  Cell Stem Cell | ... ·  昨天  
BioArt  ·  Dev Cell | ... ·  2 天前  
生信菜鸟团  ·  计算视觉 | Nat.Methods | ... ·  3 天前  
生物学霸  ·  申恩志课题组招聘启事 ·  3 天前  
生物学霸  ·  宇宙五大刊《Scientific ... ·  3 天前  
51好读  ›  专栏  ›  生信菜鸟团

不做实验、不查病历也能发文章?数据挖掘和 R 语言帮你轻松发 SCI

生信菜鸟团  · 公众号  · 生物  · 2020-12-16 23:25

正文


不知道诸位怎么看,反正以我带领十万生信工程师入门的体验来看, 绝大部分人根本就没有把R语言学扎实 ,就匆忙上路,各种踩坑叫苦连天。

咱们 务实一点 ,先老老实实听完课可以吗?https://www.bilibili.com/video/BV1cs411j75B



下面是学徒花一个星期学完B站R视频后的笔记

第1讲:介绍R语言的概括

查询安装过的包-packages里面搜搜,有的话就存在,可以通过这个命令查找包的位置

.libPaths()
[1"D:/R/R-3.5.3/library"

查找帮助文档,学习R语言是非常有效果的

?想查询的包/函数
?cbind
#R的帮助文档非常齐全,可以直接跳过,把它对应的例子跟着运行下,就会对这个函数的应用有所了解!


第2讲:R语言基础变量讲解 32min

5种数据类型:向量,矩阵,数据框,数组,列表
创建方式变量之间有等级,字符和数值是一起的时候全部变成字符内置变量前面是变量,后面是赋值内容
把向量加上一个维度,就变成矩阵

dim(a)=c(2,5)

矩阵或者是数据框取元素的方式通过两种,一种是通过下标来取,另外一种是通过逻辑值来取值

#判断类型
class(a)
str(a)

数组忽略掉,用的少

数据框

找到学习规律,不用背代码

#判断数据类型
is.matrix()#有好多种
#实现数据类型转换,as 函数,可以输入as,然后TAB补全,可以找到很多种
as.numeric()
#上面两种对应的关系,还是根据前面的英文,非常好理解了

如果要问Jimmy问题,需要把问题组织好,节省时间,把变量存放成Rdata格式,然后把其它运行的代码注释掉(内心还是挺开心的,如果把问题写得清楚了,发邮件问他问他,可以试试看大神回复不回复)

从数据框取元素
1.通过下标来取元素

INDEX1=grep("RNA-Seq",a$Assay_Type)#返回的是位置数字

#b=a[INDEX1,]等效于b=a[INDEX2,]

最常用的是使用逻辑值判断后取值

a$Assay_Type=='RNA-Seq'
INDEX2=grepl("RNA-Seq",a$Assay_Type)#按照行搜索,返回的是逻辑值
?grepl
grepl returns a logical vector (match or not for each element of x).

还举个例子挺有用的

as.numeric(unlist(lapply(d,length)))>2


第3讲:外部数据导入导出


推荐使用

read.table#这个函数来读取的,最好是在Excel里面打开再读取
?read.table

#这个函数可以直接读取.gz 文件

考题是把行名给去除掉

write.csv(row.names=F




    
)

write.table(b,row.names=F)

把变量保存为对应的.Rdata会更好点,下次load这个数据后会自动出现在环境中了,如下图所示:之前存着的变量就直接打开可以调用了。缺点是:只能使用R打开

Rdata


第4讲:中级变量操作


所有的函数都是有规律的所有函数都是有参数的

max(x) #最大值
min(x) #最小值
range(x) #max和min
which.max(x) #最大值下标
which.min(x) #最小值下标

通过上面的函数,得到对数据的初步判断,使用绘图的方式更加直观

boxplot(aAssay_Type)#表示的横坐标是种类,纵坐标是数值大小

简单的运算-加减乘除这些的
下面是讲对每一行进行操作,同样的作用,不同的写法,可能越熟练的人写得代码越精简,越不好理解。

for (i in 1:nrow(b)){
  print(mean(as.numeric(b[i,])))
}
#另外一种是
apply(b,1,function(x){
mean(x)})
#
apply(b,1,mean)

函数的概念:可以自定义一个函数的

rowMax=function(x){
  apply(x, 1, max)
}
#变量是可以任意命名的,没有什么关系

每个人的需求是不一样的,一定要学会方法

jimmy <- function(b){
  for (i in 1:nrow(b)){
    x=as.numeric(b[i,])
    y=x[1] + x[2] + x[3] - x[4]
  }
  print y
}

jimmy(b)

随意的举个例子:这个例子输入对象是一个数据框或者是矩阵,通过循环每一行,操作是每一行的第一个元素加上第二个元素加上第三个元素再减去第四个元素。

另外一个点,这个比较常用的,就是使用这个函数来筛选排名前50的值

sort(apply(b,1,sd),decreasing = T)[1:50]


第5讲:热图17分钟

热图怎么画?

回答:就是一个R包-pheatmap

library(pheatmap)
a1=rnorm(1:100)
dim(a1)=c(5,20)
pheatmap(a1)
a2=rnorm(1:100) +2
dim(a2)=c(5,20)
pheatmap(a2)

如图:

heatmap1
pheatmap(cbind(a1,a2),cluster_cols = F)
#cluster_cols    boolean values determining if columns should be clustered or hclust object.不要对列进行排序聚类

但是看不出来对应的组有哪些,所以对每个样本进行命名

b=cbind(a1,a2)
b=as.data.frame(b)
names(b)=c(paste0(c("a"),1:20 ),paste0(c("b"),1:20))
pheatmap(b,cluster_cols = F)

如图,左边是没有命名的,右边是命名的

heatmap2

那这样我们可以放心的让它们聚类了,因为选的数据集a1和a2差距大,所以能看到下图分离很开了。

b=cbind(a1,a2)
b=as.data.frame(b)
names(b)=c(paste0(c("a"),1:20),paste0(c("b"),1:20))
pheatmap(b)
#同上一步的差别在于,你对其进行了重新命名,然后需要数据按照列进行聚类分离开的,分离效果特别好,a和b这两个数据全部分离开了。

heatmap3

怎么学习一个R包
首先是把一个R包给定的例子给复制粘贴过来后,再一步步运行,看它有什么变化,需要自己去学习方法了。自己按照需求来学习
就去学习一个pheatmap这个包吧,作为练手的


第6讲:选取差异明显的基因做热图12


cg <- names(tail(sort(apply(dat, 1, sd))),1000)
#
pheatmap(dat[cg,], show_rownames = F,show_colnames = F)
#数据进行了scale,然后进行了转置
n=t(scale(t(dat[cg,])))
#去除极值点,异常点,倍数特别高的点,或者是特别低的点
n[n>2] = 2
n[n< -2] = -2
ac=data.frame(g=group_list)
pheatmap(n,show_rownames = F,show_colnames = F,annotation_col = ac)

可以把上面的操作进行一个包装,让它变成函数,可以反复使用

plot_heatmap <- function(dat,group_list){
  cg=names(tail(sort(apply(dat,, 1, sd)),1000))
  library(pheatmap)
  rownames(ac)=colnames(c)
  pheatmap(n,show_rownames = F,show_colnames = F,annotation_col = ac)
}
#再使用它的时候就直接调用函数,给它两个参数就可以了

同样,可以把其它的也这样操作下

draw_P <- function(dat,group_list){
  dat.pca <- PCA(dat[,-ncol(dat)],graph = FALSE)
  fviz_pca_ind(dat.pca,
  geom.ind = c("point","text"),col.ind = dat$group_list,palette = c("#00AFBB"),"#E7B800"),
  legend.title="Groups")

}


第7讲:ID转换 12


讲解常用的匹配函数和合并数据框
字符串切割

library(stringr)

str_split()

str_split(string, pattern, n = Inf, simplify = FALSE)
str_split_fixed(string, pattern, n)
For str_split_fixed, a character matrix with n columns. For str_split, a list of character vectors.

有个包就有注释关系,这个包是针对的芯片ID和ID之间的对应关系

library(org.Hs.eg.db)
g2s=toTable(org.Hs.egSYMBOL)
g2e=toTable(org.Hs.egENSEMBL)

#自己的数据集是有Ensemble ID的, g2e也有Ensemble ID,然后可以把他们进行关联a数据集:

b=merge(a,g2e,by="ensemle_id",all.x=T)#a数据的东西都想保留
d=merge(b,g2s,by="gene_id",all.x=T)
d=d[order(d$V1),]#进行排序
d=d[!duplicated(d$V1),]#去除重复,duplicated 函数
d=d[match(aV1),]#这个函数使用
match(x, table, nomatch = NA_integer_




    
, incomparables = NULL)Arguments

x  vector or NULL: the values to be matched. Long vectors are supported.
table  vector or NULL: the values to be matched against. Long vectors are not supported.
翻译过来:所有的table内容是按照x的顺序来排列
nomatch  the value to be returned in the case when no match is found. Note that it is coerced to integer.
incomparables  a vector of values that cannot be matched. Any value in x matching a value in this vector is assigned the nomatch value. For historical reasons, FALSE is equivalent to NULL.

判断重复的技巧

table(table(d$ensemble_id)>1)

table(d$ensemble_id)[table(d$ensemble_id)>1]

这样就完成了转换ID

第8讲:任意基因任意癌症表达量分组的生存分析 7

意引用它的名字,让它输入,自己去复制,不会报错
学会R语言的基础变量结构,然后再进行调试了,才会的

第9讲:任意基因任意癌症表达量分组的生存分析

取命要避免跟函数名重名,会干扰后续分析的

res.aov <- aov(gene~stage, data = dat)

aov: This provides a wrapper to lm for fitting linear models to balanced or unbalanced experimental designs.

第10讲:表达矩阵的样本的相关性分析

相关性的问题:

cor(x,y)

怎么筛选表达矩阵的数据
TRUE 在数值上是等于1的,所以可以通过这个来判断

library(airway)
data(airway)
exprSet=assay(airway)
colnames(exprSet)

group_list=colData(airway)[,3]
dim(exprSet)
[164102     8

通过这个进行筛选后发现:

exprSet=exprSet[apply(exprSet,1,function(x) sum(x>1)>5),]#TRUE 在数值上是等于1的,所以可以通过这个来判断dim(exprSet)[1] 19481     8

使用了一个转换:

exprSet=log(edgeR::cpm(exprSet)+1)

这个函数:
Counts per Million or Reads per Kilobase per Million
Description:Compute counts per million (CPM) or reads per kilobase per million (RPKM).

exprSet=log(edgeR::cpm(exprSet)+1)
#对其按照mad进行筛选的,选择前面500个
exprSet=exprSet[names(sort(apply(exprSet, 1, mad),decreasing=T)[1:500]),]

dim(exprSet)

M=cor(log2(exprSet+1))
tmp=data.frame(g=group_list)
rownames(tmp)=colnames(M)
pheatmap::pheatmap(M,annotation_col = tmp,filename = 'cor.png')

cor

第11讲:这个是对下游进行分析

首先是表达矩阵的构建
其中有一个错误

contrast.matrix <- makeContrasts(paste0(unique(group_list), collapse = "-"),levels = design)
Error: unexpected input in "contrast.matrix <- makeContrasts(paste0(unique(group_list), collapse = "-")?
########后面的标点符号是中文模式下的,它识别不了,所以找不到
contrast.matrix <- makeContrasts(paste0(unique(group_list), collapse = "
-"),levels = design)

DEG分析:

#DEG by limma
library(BiocManager)
BiocManager::install("CLL")
library(CLL)data("sCLLex")
exprSet=exprs(sCLLex)
pdata=pData(sCLLex)
group_list=as.character(pdata[,2])
library(limma)
design < model.matrix(~0+factor(group_list))
class(design)
colnames(design)=levels(factor(group_list))
rownames(design)=colnames(exprSet)
contrast.matrix <- makeContrasts()
?makeContrasts
contrast.matrix <- makeContrasts (paste0(unique(group_list), collapse = "-"),levels = design)
fit <- lmFit(exprSet,design)
fit2 <- contrasts.fit(fit,contrast.matrix)
fit2 <- eBayes(fit2)
tempout=topTable(fit2,coef=1,n=Inf)
nrDEG=na.omit(tempout)head(nrDEG)

第12讲:RNA-seq表达矩阵下游分析数据分析

以airway数据集为例子进行讲解的:
使用了DESEQ进行分析的

第13讲:小作业等听完了再做

p14 R-1-学习资源介绍
可视化基础:STHDA这个网站
R语言实战这本书可以看下

list.files()#列出来所有的,跟Linux一样的

第15讲:R-2与Excel的区别

跟前面的有重合,主要是选取行或者是列进行排序,简单统计,

排序:列求和:
5种变量类型:向量,矩阵,数组,列表,数据框
读取数据的时候,要设置下:

options(stringsAsFactors = F)

主要是针对数据框的操作:
数据框的要求:每一列的数据类型保持一致,列与列之间的数据类型可以不同。
R语言中是没有循环这个概念的;
不要使用c作为变量名称。

table(a$tissue)
table(a[,a$tissue=="tail"])

第16讲:R-3简单统计与数学函数

讲了常用的函数,简单的统计量

第17讲:R-4-基础语法

#取数据集的方式:
#1 根据位置来取
#2 根据逻辑值判断来取

字符串操作







请到「今天看啥」查看全文