1基本命令
getwd(), setwd() # 查看及改变工作目录
dev.off(), dev.new() #图形设备关闭,新建
rm(list = ls()) #删除所有的对象
a=1:10, dim(a)=c(2,5), View(a) #设置变量a为2行5列
is.matrix(a) #判断数据类型
as.data.frame(a) #转换数据类型
str(a) #查看数据结构
d=options(), length(d), e=d$repos # $为取d的repos
as.numeric(unlist(lapply(d, length))) #lapply函数遍历列表向量内的每个元素,并且使用指定函数来对其元素进行处理。返回列表向量。unlist()函数将list结构的数据,变成非list的数据,即将list数据变成字符串向量或者数字向量的形式。as.numeric转变为数值结构
table(as.numeric(unlist(lapply(d, length))) > 2) #table函数统计频数,统计数值大于2的频数。
index1=as.numeric(unlist(lapply(d, length))) > 2 #设置index1为列表里数值大于2的
d=d[index1] #只取数值大于2的
d[2] #数值大于2的元素中的第二个元素
d[[2]][1] #数值大于2的元素中的第二个元素的第一个元素,注意2外面有两个括号
b[1,4], b[c(T,F),4] #b共2行5列,b的第1行第4列的两种表示方法,T表示取,F表示不取
b[,3] #b的第3列
2 外部数据导入导出
a=read.table('SraRunTable.txt', sep = '\t', header = T) #sep设置列的分隔符为空格,header表头
b=read.table('GSE17215_series_matrix.txt', comment.char = '!', sep = '\t', header = T) #comment.char指定注释符号,有!的行不被读入。
write.csv(b,'GSE17215_series_matrix.csv', row.names = F) #把b导出为csv文件,' '为重命名,row.names=F把行名去掉
rownames(b)=b[,1] #把b的第一列作为行名
b=b[, -1] #去除b的第一列,-1
b=log2(b) #对b去log2值
save(b,file = 'b_input.Rdata') #保存b为b_input.Rdata,所有操作都会保存,方便下次读取及传递给别人
load(file = 'b_input.Rdata') #重新载入b_input.Rdata
3 中级变量操作
a=read.table('SraRunTable.txt', sep = '\t', header = T)
sort(a$MBases, decreasing = T)[1] #将a按MBases列排序,取第一个值,decreasing降序
max(a$MBases) #MBases列的最大值
min(a$MBases)
fivenum(a$MBases) #MBases列的最小值、下四分位数、中位数、上四分位数、最大值
b=a[a$MBases < 5000,] # 取a的MBases列中小于5000的行
boxplot(a$MBases~a$Assay_Type) #箱线图,类别型变量a$Assay_Type,a的Assay_Type列,数值型变量a$MBases
table(a$Assay_Type) #查看Assay_Type中的变量及其数量
wes=a[a$Assay_Type == 'WXS',] # ==,两个等于号表示判断,一个等于号表示赋值,取a中Assay_Type为WXS的行
rna=a[a$Assay_Type == 'RNA-Seq',] #取a中Assay_Type为RNA-Seq的行
b=grep('RNA-Seq', a$Assay_Type)
c=a[b,] #与上等效
fivenum(wes$MBases)
fivenum(rna$MBases) #分别查看rna和wes的四分位数,以便设置阈值
b=read.table('GSE17215_series_matrix.txt', comment.char = '!', sep = '\t', header = T)
str(b[1,]) #查看b的第一行的结构,为数据框 data.frame
as.numeric(b[1,]) #把b[1,]转换为数值
mean(as.numeric(b[1,])) #求一行的平均值
head(rowMeans(b)) #rowMeans 求所有行的平均值,head显示前几行
for (i in 1:nrow(b)) {
print(mean(as.numeric(b[i,])))
} # for循环求每一行的平均值
apply(b, 1, function(x){
mean(x)
}) #apply函数一般针对矩阵或数据框,遍历b,1表示行,对列处理用2表示
apply(b, 1, mean) #与上等效
rowMax=function(x){
apply(x, 1, max)
} #创造一个求每行最大值的函数rowMax
rowMax(b)
for (i in 1:nrow(z)) {
x=as.numeric(z[i,])
y=x[1]+x[2]-x[3]+x[4]-x[5]+x[6]
print(y)
} #循环求y值,对向量取元素直接坐标,对dataframe取元素逗号左边为行,逗号右边为列(list一样)
ji = function(z){
for (i in 1:nrow(z)) {
x=as.numeric(z[i,])
y=x[1]+x[2]-x[3]+x[4]-x[5]+x[6]
print(y)
}
} #创造一个求y值的ji函数
ji(b)
sort(apply(b, 1, sd), decreasing = T)[1:50] #求每行的标准差,求值最高的前50行
。用sort先按降序 排序,再取前50
names(sort(apply(b, 1, sd), decreasing = T)[1:50]) #names可以得出相应的行名
sample(1:nrow(b), 50) #随机取50个
4 热图
a1=rnorm(100)
dim(a1)=c(5,20)
pheatmap(a1)
a2=rnorm(100)+2
dim(a2)=c(5,20)
pheatmap(a2)
pheatmap(cbind(a1,a2), cluster_cols = F ) #cbind按列合并对象,rbind为按行合并。按照单一方向聚类,cluster_cols = F 按列 聚类关闭。
b=cbind(a1,a2)
b=as.data.frame(b) #把b换为数据框格式
names(b)=c(paste('a1',1:20,sep='_'),paste('a2',1:20,sep='_')) #给b中的列赋名。row.names可以给数据库中的行赋名。paste('a1',1:20,sep='_')把a1跟1到20的数字分别连接起来,间隔为_。
tmp=data.frame(group=c(rep('a1',20),rep('a2',20))) #添加了新变量group
rownames(tmp)=colnames(b) #一定要设置tmp的行名为b的列名
pheatmap(b,annotation_col = tmp) #添加注释信息
?pheatmap 可以看到pheatmap的帮助文档,最下面有example的代码,可以详细的试一下每个参数的功能。
在矩阵中,只能保留一种数据类型,但在data.frame中可以保留多种数据类型
5 选取差异明显的基因的表达量矩阵绘热图
n=t(scale(t(dat[cg,]))) ##均一化(normalization)调整差异过大的数,用t函数转置再scale再用t函数转置回来。
n[n>2]=2#设置大于二的值均等于二
n[n<-2]=-2#设置小于负二的值均等于负二
6 id转换
strsplit('EN003.13','[.]')[[1]][1] #以点号.分隔开取第一个元素即EN003
library(stringr) #载入stringr包,处理文本
str_split(a$V1,'[.]',simplify = T)[,1] #用str_split()函数,simplify=T返回值为字符型矩阵,F返回为字符型向量,[,1]取第一列
library(org.Hs.eg.db)#加载org.Hs.eg.db包,包含了注释信息
toTable()#org.Hs.eg.db包规定读入数据用toTable
g2s=toTable(org.Hs.egSYMBOL)
g2e=toTable(org.Hs.egENSEMBL)
b=merge(a,g2e, by='ensembl_id', all.x=T) #把两个数据框a和g2e,按照共有的ensembl_id列合并(关联)起来,all.x=T保留没有关联上的元素,即有的元素没有相同的列名
d=merge(b,g2s, by='gene_id', all.x=T) #把a和g2e关联后的数据框b,再和g2s合并
table(table(d$ensembl_id)>1) #统计数据框d中ensembl_id列内频率大于1的元素的数目
table(d$ensembl_id)[table(d$ensembl_id)>1] #查看数据框d中ensembl_id列内频率大于1的元素
d=d[!duplicated(d$V1),] #对d的V1列内重复的行去重
d=d[match(a$V1, d$V2),] #把a中的顺序,放到d这边来。使d按照数据框a的顺序。
7和8
a=read.table('*.csv',header = T,sep = ',',fill = T) #fill=T读取不规则的数据
library(ggbetweenstats)
ggbetweenstats(data=a,x='Group',y='Expression') #横坐标按group列,纵坐标按Expression列
colnames(a)=c('id','stage','gene','mut') #设置列名
9 表达矩阵的样本的相关性
cor(1:10,1:10) #cor常用于计算两组数据之间的皮尔森 相关系数
a=rnorm(10)
b=10*a+rnorm(10) #b相当于a的10倍,后面加的rnorm(10)相比只是噪音,所以a和b的相关性很高。
cor(a,b) #算a和b的相关性
if (!requireNamespace("BiocManager"))
install.packages("BiocManager") #安装BiocManager
if (!requireNamespace("BiocManager", quietly = TRUE))
install.packages("BiocManager")
BiocManager::install("airway", version = "3.8") #安装Bioconductor的airway包R版本3.5之后,Bioconductor的包,需要先安装BiocManager,再用BiocManager来安装Bioconductor的包
data(airway) #载入airway的数据,Bioconductor三个包:airway(数据包),Annotatiobdbi(注释包)和GenomicFeatures(功能函数包)
exprSet=assay(airway) #assay,把airway的数据,转换成矩阵matrix
dim(exprSet) #dim函数查看矩阵的维度情况
colnames(exprSet)
cor(exprSet[,1],exprSet[,2])
cor(exprSet) #对所有的列求相关性
pheatmap(cor(exprSet))
group_list=colData(airway)[,3] #为热图加注释
tmp=data.frame(g=group_list) #分组并转为一个数据框
rownames(tmp)=colnames(exprSet) #有多少列不重要,必须保证注释信息的行名等于数据框的列名
pheatmap(cor(exprSet),annotation_col = tmp)
筛选数据,如果一个基因的表达量大于1的样本数少于5,去掉这个基因
x= exprSet[1,] #以数据框的第一行即第一个基因做示范
table(x>1) #可以用table统计表达量大于1的数目,更好的方法是用sum
true=1,false=0 #判断结果 true等价于1,false等价于0
sum(x>1)>5 #总数大于5,即表示有五个true
apply(exprSet, 1, function(x) sum(x>1) >5) #遍历数据框的每一行,判断是否满足表达量大于1的样本数大于5
exprSet=exprSet[apply(exprSet, 1, function(x) sum(x>1) >5),] #把符合条件的提取出来
##继续筛选
exprSet=log(edgeR::cpm(exprSet)+1) # edgeR::cpm()函数去除文库大小差异
names(sort(apply(exprSet,1,mad),decreasing = T)[1:500]) #mad为求中位数绝对偏差,降序排序后取前500个的行名
exprSet=exprSet[names(sort(apply(exprSet,1,mad),decreasing = T)[1:500]),] #把上一步的前500个行名的行提取出来
M=cor(log2(exprSet+1)) #再做相关性,就体现出来了差别
tmp=data.frame(g=group_list)
rownames(tmp)=colnames(M)
pheatmap(M, annotation_col = tmp)