根据列删除某些行

时间:2015-11-06 22:19:12

标签: r dataframe bioinformatics

我有一个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

4 个答案:

答案 0 :(得分:3)

new_df <- old_df[which(old_df$A1!='C' & old_df$A2!='G' | old_df$A1!='G'& old_df$A2!='C'),]

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分: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倍。)

答案 3 :(得分:2)

使用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
相关问题