2015-11-06 2 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 && указывают логические И и | и || указывают логический ИЛИ. Более короткая форма выполняет элементарные сравнения во многом так же, как и арифметические операторы. Более длинная форма оценивает слева направо, исследуя только первый элемент каждого вектора « –

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

Этот 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 

Это близко к dplyr-версии @ JacobH отвечают, но предлагает другой формат для определения пар-к-быть удалены. (Его примерно в 8 раз быстрее с большими наборами данных.)

Смежные вопросы