根据列删除某些行
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 倍。)
我有一个 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 倍。)