「帮豆豆」再说R语言没有用,打你
今天是生信星球陪你的第458天
大神一句话,菜鸟跑半年。我不是大神,但我可以缩短你走弯路的半年~
就像歌儿唱的那样,如果你不知道该往哪儿走,就留在这学点生信好不好~
这里有豆豆和花花的学习历程,从新手到进阶,生信路上有你有我!
花花写于2019-09-25
豆豆导读
今天处理数据的时候,遇到了一个问题,单细胞的表达矩阵里面有些基因是重复多次的,重复基因都加了后缀xxx_locn,需要去重,把每个基因的表达量求和。
例如“OTTMUSG00000016609”这个基因在原始矩阵中出现了6次,有6行,我们需要只保留一行,对这六行的每一列分别求和:

变成:

(一篇文章里这么做的,这个方法不适用于GEO转录组什么的,但是可以拿来学R啊)
这样的基因有很多个,我还不想改变基因的顺序。被难住了,求助我们家R语言小神仙、万能小伙伴、超级无敌小女朋友花花!(自愿夸奖)
因为她说过,能放进数据框里的需求都难不倒她,这个记录至今没有打破过,她膨胀,这篇帖子就是她帮我解决问题的记录啦(被拉来写导读)。出神入化的R语言技巧学起来!
思路
这个问题本质上就是个R语言数据框问题,那就直接撸袖子上了。写这个代码差不多花了半小时~有点难度~~~
1.行名不能有重复,干脆把基因名作为第一列X。
2.首先需要匹配第一列X里面以_loc加数字结尾
的并删掉,只留基因名,stingr配正则值得拥有,这个操作不光stringr可以做,tidyr里的seprate分隔列,然后只留第一列,也能做到。
(吐槽一下, 想找我的R数据科学对应stringr的笔记,结果发现简书把我文章封了,我自己都看不了,气死了。)
3.重复的基因只留第一个,duplicated和unique都可以,然后修改这一行的内容为该基因几个表达量的和。
4.想过summarise配group_by,失败。想过apply,也不好做,最后优秀的只有for循环!
代码实现
1.示例数据
在生信星球后台回复"合并"
即可获得示例数据。
options(stringsAsFactors = F)
df = read.csv("help.csv")
dim(df)
#> [1] 19972 501
df[1:4,1:4]
#> X V3 V4 V5
#> 1 Tspan12 0 0 0
#> 2 Tshz1 3 1 0
#> 3 Fnbp1l 3 1 6
#> 4 Adamts15 0 0 0
df的第一列是基因名,后面500列是表达量。
x = df[,1]
head(x,10)
#> [1] "Tspan12" "Tshz1" "Fnbp1l" "Adamts15"
#> [5] "Cldn12" "Rxfp1" "2310042E22Rik" "Sema3c"
#> [9] "Jam2" "Apbb1ip"
2.删除重复基因的后缀
正则表达式匹配后缀,我翻笔记就是为了找这个,d
表示匹配任意数字。
if(!require(stringr)) install.packages("stringr")
#> Loading required package: stringr
library(stringr)
#删掉重复基因的后缀
df$X = str_replace(df$X,"_loc\d","")
有重复的基因有多少个呢?这就决定了下面的for循环要跑多少次。
y = unique(df$X[duplicated(df$X)])
length(y)
#> [1] 111
3.生成结果,一个新的数据框
先将df直接去重,得到df2。
df2 <- df[!duplicated(df$X),]
dim(df2)
#> [1] 19806 501
现在要做的是,用df每个基因每列(多行)的表达量和,填充df2对应的基因(一行)的值!
我用的方法是把每个基因单独提取出来作为一个数据框,colSums求列和,然后将列和填充到df2里面去!这是一个天生优秀的数据框取子集和修改搭配for循环的操作,哈哈,测试了一下时间6秒多,阔以。
system.time(for(i in y) {
a <- df[df$X == i,]
b <- colSums(a[,-1])
names(b) <- NULL
df2[df2$X == i,-1] <- b
})
#> user system elapsed
#> 6.05 0.09 6.17
最后检查一下对不对,随便拿一个重复基因来试试。
sum(df2[df2$X==y[1],501])
#> [1] 11
sum(df[df$X==y[1],501])
#> [1] 11
yeah!请豆豆同学给我买麦旋风和蓝莓派。
向大家隆重推荐隔壁生信技能树的一系列干货!
点击底部的“阅读原文”,获得更好的阅读体验哦😻
初学生信,很荣幸带你迈出第一步。
我们是生信星球,一个不拽术语、通俗易懂的生信知识平台。由于是2018年新号,竟然没有留言功能。需要帮助或提出意见请后台留言、联系微信或发送邮件到jieandze1314@gmail.com,每一条都会看到的哦~
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!