查看原文
其他

每个月新来的学徒我都会让他/她花十几个小时学习完我的B站R视频课程:

应该是我自己的学徒就贡献了一半的学习量吧,距离我夸下海口的10万工程师相差甚远,所以非常有必要放一些导学笔记,这个春节,难度你没有发现特别适合猫在家听视频搞学习吗?而且我们还有一系列免费数据分析提供给你:

我们推文里面提到的数据分析环节都是我非常有经验的, 对我来说是举手之劳,希望可以帮助到你!

发送数据分析要求,以及简短的项目描述到我的邮箱 jmzeng1314@163.com 就有机会获得!

学徒导学笔记
前言

我之前有看过R语言实战这本书的,对R语言的一些基本常识有一定的了解,安装了R和RStudio,跟着前几章一起敲敲代码。但是在实战过程中还是遇到了很多问题,有同学跟我推荐了生信技能树的R语言视频
https://www.bilibili.com/video/av25643438?from=search&seid=2551270350430081623
下面是我的随笔,不系统的记录,是根据自己所需补充的知识点。


第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 根据逻辑值判断来取

字符串操作

strsplit
#这个函数得到了一个List
#通过使用lapply进行操作的
#字符串分割函数:strsplit()
#字符串连接函数:paste0()
#计算字符串长度: nchar()
#字符串截取函数:substr() substring()
#字符串替换函数:chartr()
#大小写转换函数:toupper() tolower() casefold()
#Hadley Wickham开发的一个灵活的字符串处理包stringr

第18讲:高级数据处理技巧

apply 函数的使用

library(CLL)
data("sCLLex")
exprSet=exprs(sCLLex)
#第一种方法
unlist(lapply(tmp,','), function(x){x[2]}))
#第二种方法
str_split(tmp,',',simplify = T)[,2]
#第三种方法
do.call(rbind,strsplit(tmp,','))[,2]

多使用这个去检查下

str#函数的使用,检测数据类型

第19讲:绘图该如何学习

多搜索,多去尝试下;

STHDA画图网站去学习;
R语言可视化的书可以参考下,怎么学习。

第20讲:R-7作业

晚上再做作业。

第23讲:系统性的入门R语言

跟之前的比较像,Excel与R的区别在于:可以另存为.Rdata的文件。

第24讲:可视化基础

多试,多查,多想下。

第25讲:可视化进阶

后面的爬虫之类的听了下,但是需要花时间再去理解下。

dcast(data,formula = V2~V1)
#A formula of the form LHS ~ RHS to cast, see Details;列是基因,行是样本

第26讲:用shiny写一个计算器

这个主要是一个R语言编写网页交互工具,我感觉还挺好玩的,但是要理解的点很多,水平太low了,没法理解。

第27讲:R语言操作图片

这个我用不着,知道有这个资源,听完了,是用函数进行读取png

第28讲和第29讲:R语言爬虫

有趣的爬虫,有空了可以参考下试试。

第30讲:用R语言进行ID转换

这个主要讲解了match 函数,使用match对两个数据框根据某一个相同的列进行匹配,挺好用的函数。

第31讲:多个差异分析结果直接两两取交集和并集

需要Python编程,这个我看了下,觉得有点难,跳过了下。

第32讲:用R语言进行多个同样的行列式文件进行合并


这个就是前几天布置的作业,我要给它做完;
#推荐了这个教程-学习WGCNA总结。

第33讲:是用markdown制作转录组差异分析流程


这个看着写完后的效果,还是非常好的。准备接着32的作业跟着尝试写下
我之前看了B站的评价。

comment-good

当然还有下面的:

comment-bad
总结

讲真的,我刚开学得时候,跟这个伽兰德半自动的想法很相像,发现这个视频课不适合我这种一点概念都没有的人。后来自己补了下R语言实战的这本书后,再去看看生信技能树或者是菜鸟团布置的任务。转过头再来回顾下这个教程,的确在生信数据的实战中,这个教程很实在,跟下面的同学想法类似,干货还是很多,可能需要自己再额外花功夫去学习下,毕竟讲课的人跟我们所在的水平不在一条线上,所理解的程度不一样。

后面的打算是:跟着公众号-生信菜鸟团布置的作业题,去尝试做题目,熟练R语言,应用R语言。也许做完题后,再来温故这个视频课,又会得到不一样的理解。


还是非常感谢这个视频课的制作者,分了三期-从看视频的角度上来说,P1 - P13 作为第一期应该是最新的一期了,P14-P20是第二期;剩下的是第三期,中间会有知识点的重合,也有制作者的学习建议,挺好的,能够完整的制作下来,并免费分享,还有被解答的福利,真的是非常感谢生信技能树~🤗🤗🤗

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存