删除行取决于另一行R中的列值

时间:2018-05-07 11:09:16

标签: r

我有以下数据框和多个观察结果:

     CHR            END         START          REF         ALT
      1            1445         1446            G           A
      1            1445         1446            A           G
      3            2787         2787            T           -
      3            2787         2787            -           T

我希望删除行,如果REF列为-ALT列匹配另一行的REF列,而其他列保持不变。

在我的例子中是所需的输出:

     CHR            END         START          REF         ALT
      1            1445         1446            G           A
      1            1445         1446            A           G
      3            2787         2787            T           -

我不确定如何连接不同行的索引

始终在数据框中,要删除的行遵循“母亲”行

1 个答案:

答案 0 :(得分:1)

你可以尝试

library(tidyverse)
d %>% 
  unite(tmp, REF, ALT, remove = F) %>% 
  mutate(tmp=strsplit(tmp, "_") %>% map_chr(function(x) paste(sort(x), collapse ="_"))) %>% 
  group_by(CHR, END, START, tmp) %>% 
  mutate(n=ifelse(grepl("-", tmp), 1:n(), 1)) %>% 
  filter(n == 1) %>% 
  ungroup() %>% 
  select(-tmp, -n)
# A tibble: 3 x 5
    CHR   END START REF   ALT  
  <int> <int> <int> <fct> <fct>
1     1  1445  1446 G     A    
2     1  1445  1446 A     G    
3     3  2787  2787 T     - 

我们的想法是使用tmpALT方法添加带有排序REFstrsplit值的标识map。因此,我们可以使用类似行的计数来重复过滤。

数据

d <- read.table(text=" CHR            END         START          REF         ALT

                1            1445         1446            G           A
                1            1445         1446            A           G
                3            2787         2787            T           -
                3            2787         2787            -           T", header=T)