我们的生信入门班和数据挖掘线上直播课程已经有了三年多的历史,培养了一波又一波优秀的生信人才。本期分享的内容不是课堂上讲的,而是给了踮一踮脚能做出来的超纲练习题,启发学员主动学习,而不是一味等待投喂。
下面来看优秀学员徐谦同学的分享:
R语言超纲练习题
(生信技能树优秀学员徐谦)
这是目前马拉松授课线上直播课程的一道R语言部分的拓展题,最近的一期是下周一开课哦:
- 数据挖掘(GEO,TCGA,单细胞)2022年6月场,快速了解一些生物信息学应用图表
- 生信入门课-2022年6月场,你的生物信息学第一课
看到班里有同学写了超纲题解法,思路很赞,不过现在已经不超纲了,接下来的GEO课程小洁老师肯定也会强调这一常规操作,下面就针对性提出两种新的思路作为参考:
一、merge
不管soft和exp中的ID是否一直,直接交叉合并,不需再进行%in%和排的操作,代码如下:
代码语言:javascript复制exp <- read.csv("exp.csv")
anno <- read.table("soft.txt",header = T,sep = "t")###注释文件和表达矩阵探针名对应的列名保持一致
colnames(exp)[1] <- "ID"
exp_new <- merge(exp,anno,by="ID")
##按照一样的理念,只保留第一次出现的基因名
exp_new <- exp_new[!duplicated(exp_new$GeneName),]
rownames(exp_new) <- exp_new$GeneName ###基因名变为行名
exp_new <- as.matrix(exp_new[,2:7])###转换为矩阵
二、祭出我们的神器tidyverse
对重复基因的处理,我个人实际操作中更倾向去取平均值最大的一行。这样就可以用神器dplyr和其他包来做,可以说Hadley大神改变的R的生态。具体代码如下,一步一步运行下就知道怎么来的了,可以选中管道符之前的代码,按Ctrl Enter,这样没选中的代码就不运行了,挨个加上去看管道符操作了什么:
代码语言:javascript复制library(dplyr)
library(tibble)
colnames(exp)[1] <- "ID"
exp_new <- exp %>%
#合并探针的信息
inner_join(anno,by="ID") %>%
#去掉多余信息,select支持按列名和列号同时选择
select(c(GeneName,2:7)) %>%
#·增加一列,内容为每一行的平均数
mutate(rowMean =rowMeans(.[,-1])) %>%
#把表达量的平均值按从大到小排序
arrange(desc(rowMean)) %>%
# 去重,GeneName留下第一个
distinct(GeneName,.keep_all = T) %>%
#GeneName转换为行名
column_to_rownames(var="GeneName") %>%
#反向选择去掉平均值的那一列
select(-rowMean)
管道符后面的.可以代表管道符前面传入的数据,如果调用tidyverse的函数应该都是可以省略的,默认第一个参数,如果调用其他函数,用.代替就行。结果如下:
思想来自果子老师。