美文网首页R语言与统计分析R语言编程进阶R小推车
如果GEO中一个探针对应多个基因,如何把这个探针全部删掉?

如果GEO中一个探针对应多个基因,如何把这个探针全部删掉?

作者: 9d760c7ce737 | 来源:发表于2019-06-30 22:53 被阅读38次

这个操作归类为去重,那么R语言里面有哪些去重的操作呢?
先创建一个带有重复项的数列

dd <- c(1,3,5,5,5,6,7,7,8,9,9,9,9)

第一个去重的是unique

这是真正意义上的去重,

unique(dd)

[1] 1 3 5 6 7 8 9

他会去掉里面的重复项,保留重复项中的一个,也就是说虽然5是重复了,但是会保留一个5下来


第二个能去重的是duplicated

这个函数比较温和,他返回逻辑值,如果有重复的会返回TRUE

duplicated(dd)

如果要获取非重复项,需要感叹号!取反才可以

dd[!duplicated(dd)]

[1] 1 3 5 6 7 8 9

第三个去重是dplyr包中的distinct函数

他作用的是数据框,用于筛选行,如果有重复会保留第一个

library(dplyr)
data.frame(dd) %>% 
  distinct(dd) %>% 
  pull(dd)

[1] 1 3 5 6 7 8 9

用在这里大材小用了。
他的大用在这里
GEO芯片中多个探针对应一个基因,是求平均值还是保留最大值?

但是现在需求变了,如何去掉所有的重复项

这意味着,只要他是重复的,他本身就不能保留,一个都不可以



这个需求要费点周折,用非重复的数字集合,减去重复的数字集合就可以了

setdiff(unique(dd),dd[duplicated(dd)])

[1] 1 3 6 8

但是真实情况下,我们不这样做,因为太麻烦了,请看例子
现在有个数据



ID那一列有能够对应多个基因的探针,我们需要把它给去掉。
先把这个探针找出来

table(table(data$ID))

1 2
2971 6

有6个探针可以对应两个基因,需要把他们给删掉,实际上,个数少,手工操作也行。
如果我们尝试保留那2971个单一的探针,可以先计数,找出等于1的探针,然后跟原数据merge取交集就可以了, merge的对象得是数据框。

idlist <- table(data$ID)
id <- data.frame(ID=names(idlist[idlist==1]))
data1 <- merge(data,id,by="ID")

基于以上的想法,如果用dplyr来做,更加直白一点

library(dplyr)
data2 <- data %>% 
  count(ID) %>% 
  filter(n==1) %>% 
  inner_join(data,by="ID") %>% 
  select(-n)

最终殊途同归


我是果子,最近腹泻得人都小了一圈,明天见。

相关文章

网友评论

    本文标题:如果GEO中一个探针对应多个基因,如何把这个探针全部删掉?

    本文链接:https://www.haomeiwen.com/subject/kqxycctx.html