【问题标题】:Delete certain rows based on columns根据列删除某些行
【发布时间】:2015-11-06 22:19:12
【问题描述】:

我有一个如下的data.frame:

SNP             A1      A2      EFF                     FRQ
rs12565286      C       G       -0.00225985777786465    .04354
rs11804171      A       T       -0.00530020318295282    .04485
rs3094315       C       T       -0.0042551489236695     .8364
rs12562034      A       G       -0.00911972489527125    .09763
rs12124819      G       A       0.0250148724382224      .7744
rs2980319       A       T       0.0178927256033542      .1306
rs4040617       A       G       -0.0173263263037023     .8707

我想删除任何具有 A1-A2 对的 C-G、G-C、A-T 或 T-A 的行。

例如,由于第一行有 A1 = C 和 A2 = G,我想删除该行。我还想删除第二行,因为它是 A-T 对。第三行是AG对,很好,我想保留它。

我想要的输出:

    SNP             A1      A2      EFF                     FRQ
    rs3094315       C       T       -0.0042551489236695     .8364
    rs12562034      A       G       -0.00911972489527125    .09763
    rs12124819      G       A       0.0250148724382224      .7744
    rs4040617       A       G       -0.0173263263037023     .8707

【问题讨论】:

  • 要排除不明确的 SNP,请查看 snpflip

标签: r dataframe bioinformatics


【解决方案1】:

我喜欢这种方法,因为它不需要我觉得烦人的大量 |& 调用。话虽如此,我想其他方法会运行得更快。

r <- c("C", "G", "A", "T")
l <- c("G", "C", "T", "A")

df[!(paste0(df$A1, df$A2) %in% paste0(r,l)), ]

【讨论】:

    【解决方案2】:
    new_df <- old_df[which(old_df$A1!='C' & old_df$A2!='G' | old_df$A1!='G'& old_df$A2!='C'),]
    

    编辑:没看到不等于 编辑:排除 AT 和 TA,因为这足以解决进一步的情况

    【讨论】:

    • 这不会返回正确的结果。您应该使用&amp;| 而不是&amp;&amp;||,但之后仍然不正确。
    • 我理解 && ,||错误,但如果使用 & 和我,为什么会不正确
    • 查看文档:“& 和 && 表示逻辑 AND,| 和 || 表示逻辑 OR。较短的形式执行元素比较的方式与算术运算符大致相同。较长的形式计算从左到右只检查每个向量的第一个元素"
    • 它仍然行不通,因为它们都是真的。拆开来看一下old_df$A1!='C' &amp; old_df$A2!='G' | old_df$A1!='G' &amp; old_df$A2!='C'的结果
    • @JacobH 我排除了 AT 和 TA,因为我认为我的回答足以解决进一步的问题。
    【解决方案3】:

    另一个dplyr 方法,在@JacobH 和@DatamineR 的答案基础上构建了一点。

    这个data.frame在R中定义,但是如果更大和/或需要其他输入,可以在其他地方处理(电子表格?)并读入这种格式。

    removeDF <- data.frame(A1=c('C','G','A','T'),
                           A2=c('G','C','T','A'),
                           REMOVE=TRUE, stringsAsFactors=FALSE)
    

    REMOVE 变量只是用来指示一行是否成功合并(即是否需要删除)。

    library(dplyr)
    df %>%
        left_join(removeDF, by=c('A1','A2')) %>%
        filter(is.na(REMOVE)) %>%
        select(-REMOVE)
    ##          SNP A1 A2          EFF     FRQ
    ## 1  rs3094315  C  T -0.004255149 0.83640
    ## 2 rs12562034  A  G -0.009119725 0.09763
    ## 3 rs12124819  G  A  0.025014872 0.77440
    ## 4  rs4040617  A  G -0.017326326 0.87070
    

    这接近于@JacobH 答案的 dplyr 版本,但提供了不同的格式来定义要删除的对。 (对于更大的数据集,他的速度大约快 8 倍。)

    【讨论】:

      【解决方案4】:

      dplyr 你可以试试:

      library(dplyr)
      df %>% filter(!(A1=="C" & A2 == "G" | A1 == "G" & A2 == "C" | A1 == "A" & A2 == "T" | A1== "T" & A2 == "A"))
               SNP A1 A2          EFF     FRQ
      1  rs3094315  C  T -0.004255149 0.83640
      2 rs12562034  A  G -0.009119725 0.09763
      3 rs12124819  G  A  0.025014872 0.77440
      4  rs4040617  A  G -0.017326326 0.87070
      

      【讨论】:

        猜你喜欢
        • 2022-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-26
        • 2016-08-28
        • 2018-02-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多