系统学习+主动探索,是最舒适的入门学习方式!

2022-06-27 20:20:31 浏览数 (1)

我们的生信入门班和数据挖掘线上直播课程已经有了三年多的历史,培养了一波又一波优秀的生信人才。本期分享的内容不是课堂上讲的,而是给了踮一踮脚能做出来的超纲练习题,启发学员主动学习,而不是一味等待投喂。

系统学习+主动探索,是最舒适的入门学习方式!

下面来看优秀学员佳男同学的分享:

R语言超纲练习题

(生信技能树优秀学员佳男同学)

  • 数据挖掘(GEO,TCGA,单细胞)2022年6月场,快速了解一些生物信息学应用图表
  • 生信入门课-2022年6月场,你的生物信息学第一课

首先,读取数据使用read.table和read.csv函数,并使用dim看一下大致几行几列,因为肯定有重复的【题目的坑】,所以不设置read.csv里的rownames=1,先都读取进来。

代码语言:javascript复制
> exp=read.csv("exp.csv")
> dim(exp)
[1] 1000    7
> soft2 <- read.table("soft.txt",header = T,sep = "t")
> dim(soft2)
[1] 1000    5

exp表达矩阵,读进来是个数据框

soft数据框,其中的genenames和ID对应,且我们需要替换的就是需要这两列数据

我先使用%in%判断了一下exp和soft2里面的表达矩阵是互相对应的,但是使用identical函数判断一下是否完全一致,返回却是F,说明顺序不一致,需要灵活使用match函数调整顺序一致。其中soft3就是根据exp文件中的ID列顺序调整好的,然后再使用identical函数判断一下是否完全一致,返回T,完成。最后直接将soft3里的genename赋值给exp的x就是行名一列就可以完成替换。

代码语言:javascript复制
> table(exp$X %in% soft2$ID)
TRUE 
1000 
> table(soft2$ID %in% exp$X)
TRUE 
1000 
> identical(soft2$ID,exp$X)
[1] FALSE
> soft3=soft2[match(exp$X,soft2$ID),]
> identical(soft3$ID,exp$X)
[1] TRUE
exp$X=soft3$GeneName

接下来,首先要去掉exp表达矩阵里的重复基因,因为重复基因的存在使得我们无法将之作为行名。 直接先使用duplicated函数判断exp的x行名这一列的重复基因,重复的返回T,然后我们直接将之作为索引,反向在exp里进行提取子集的操作就可以将重复的基因去掉并赋值给新的表达矩阵exp1。 然后将exp1的x这行不重复的基因名直接作为行名,函数为rownames。 最后去掉多余的x这一行并赋值给新的表达矩阵exp2.exp2就是我们要的表达矩阵。

代码语言:javascript复制
> exp1=exp[!duplicated(exp$X),]
> rownames(exp1)=exp1$X
> exp2=exp1[,(-1)]
> View(exp2)

「第二种解法多个探针对应同一个基因时,取平均值」 前面操作都一样,调整顺序将ID换成基因名,重点是如何处理重复的基因名 使用aggregate函数,https://www.jianshu.com/p/7912aac76d5f【这是aggregate函数的说明】 aggregate函数是数据处理中常用到的函数,具有强大的功能。可以按照要求把数据打组聚合,然后对聚合以后的数据进行加和、求平均等各种操作。具体说明可使用命令:help("aggregate")获取官方文档

代码语言:javascript复制
> ###第二种方法,将重复的基因名按照表达量取平均值
> expr_mean=aggregate(.~X,mean,data=exp)
> rownames(expr_mean)=expr_mean$X
> expr_mean=expr_mean[,(-1)]
> View(expr_mean)

「第三种方法:对于相同的基因,我们挑选行平均值大的那一整行」

代码语言:javascript复制
> ####第三种方法,取表达值最大的一行
> #计算行平均值,按降序排列
> index=order(rowMeans(exp[,-1]),decreasing = T)
> #调整EXP的基因顺序
> expr_ordered=exp[index,]
> #对于有重复的基因,保留第一次出现的那个,即行平均值大的那个
> keep=!duplicated(expr_ordered$X)
> #得到最后处理之后的表达谱矩阵
> expr_max=expr_ordered[keep,]
> expr_max
> rownames(expr_max)=expr_max$X
> expr_max=expr_max[,(-1)]
> View(expr_max)

「小洁老师补充」:tibble::column_to_rownames()可以将列直接转为行名,可以优化代码,但是学员做这个题的时候还没讲到,初学者写代码先完成,再完美~ 另外,数据框不允许重复的行名,其实矩阵是允许的,可以试试看把exp转为矩阵会不会让代码更简单~ ❞

0 人点赞