根据列删除某些行

Delete certain rows based on columns

我有一个 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
new_df <- old_df[which(old_df$A1!='C' & old_df$A2!='G' | old_df$A1!='G'& old_df$A2!='C'),]

编辑:没看到不等于 编辑:排除 AT 和 TA ,因为这足以处理更多案件

使用 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

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

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

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

另一种 dplyr 方法,根据@JacobH 和@DatamineR 的回答构建了一些内容。

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

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 倍。)