查询安装过的包-packages里面搜搜,有的话就存在,可以通过这个命令查找包的位置
.libPaths() [1 ] "D:/R/R-3.5.3/library"
查找帮助文档,学习R语言是非常有效果的
?想查询的包/函数 ?cbind#R的帮助文档非常齐全,可以直接跳过,把它对应的例子跟着运行下,就会对这个函数的应用有所了解!
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
推荐使用
read.table#这个函数来读取的,最好是在Excel里面打开再读取 ?read.table#这个函数可以直接读取.gz 文件
考题是把行名给去除掉
write.csv(row.names=F
) write.table(b,row.names=F )
把变量保存为对应的.Rdata会更好点,下次load这个数据后会自动出现在环境中了,如下图所示:之前存着的变量就直接打开可以调用了。缺点是:只能使用R打开
Rdata
所有的函数都是有规律的所有函数都是有参数的
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 ]
热图怎么画?
回答:就是一个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这个包吧,作为练手的
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" ) }
讲解常用的匹配函数和合并数据框
字符串切割
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
意引用它的名字,让它输入,自己去复制,不会报错
学会R语言的基础变量结构,然后再进行调试了,才会的
取命要避免跟函数名重名,会干扰后续分析的
res.aov <- aov(gene~stage, data = dat)
aov:
This provides a wrapper to lm for fitting linear models to balanced or unbalanced experimental designs.
看
相关性的问题:
cor(x,y)
怎么筛选表达矩阵的数据
TRUE 在数值上是等于1的,所以可以通过这个来判断
library (airway) data(airway) exprSet=assay(airway) colnames(exprSet) group_list=colData(airway)[,3 ] dim(exprSet) [1 ] 64102 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
首先是表达矩阵的构建
其中有一个错误
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)
以airway数据集为例子进行讲解的:
使用了DESEQ进行分析的
p14 R-1-学习资源介绍
可视化基础:STHDA这个网站
R语言实战这本书可以看下
list.files()#列出来所有的,跟Linux一样的
跟前面的有重合,主要是选取行或者是列进行排序,简单统计,
排序:列求和:
5种变量类型:向量,矩阵,数组,列表,数据框
读取数据的时候,要设置下:
options(stringsAsFactors = F )
主要是针对数据框的操作:
数据框的要求:每一列的数据类型保持一致,列与列之间的数据类型可以不同。
R语言中是没有循环这个概念的;
不要使用c作为变量名称。
table(a$tissue) table(a[,a$tissue=="tail" ])
讲了常用的函数,简单的统计量
#取数据集的方式: #1 根据位置来取 #2 根据逻辑值判断来取
字符串操作