2015-11-06 84 views
1

某些行我有如下一個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

要排除模糊的SNP,請查看[snpflip](https://github.com/endrebak/snpflip)。 – zx8754

回答

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

這不會返回正確的結果。你應該使用'&'和'|'而不是'&&'和'||',但是之後它仍然不正確。 –

+0

我瞭解&&,||錯誤,但爲什麼如果使用&和I,它會不正確 – Bg1850

+0

查看文檔:「&和&&表示邏輯AND並且|和||表示邏輯OR。更短的表單執行元素比較的方式與算術運算符。較長的形式評估從左到右檢查每個矢量的第一個元素「 –

3

我喜歡這種方法,因爲它不需要衆多|&我覺得很煩人。這就是說,我會想象其他方法會跑得更快。

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

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

另一個dplyr方法,建立一個小關@JacobH和@ DatamineR的答案。

此數據框架在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版本,但提供了不同的格式定義對對被移除。 (對於較大的數據集,His大約快8倍)。