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