美文网首页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