使用dplyr删除重复的观察

时间:2017-09-07 09:33:35

标签: r filter dplyr

这是前一个问题的后续内容,其中我之前的解决方案似乎不适用于更复杂的数据集。 上一个问题: Filter out observations present in specific pairs of samples in R

我正在尝试过滤数据集,以排除特定样本对中存在重复观察的行。

新数据集包含许多不同的相关样本对

sample observation1 observation2
sample1A 10 x
sample1A 15 y
sample1A 20 x
sample1B 7 h
sample1B 15 a
sample1B 22 s
sample2A 10 g
sample2A 11 g
sample2A 14 g
sample2A 20 h
sample2B 10 a
sample2B 30 t
sample2B 40 a
sample2B 50 h

在上面的例子中,我需要排除与样品1B相比,samples1A的observation1相同的行,以及样品2B与样品2B相比的情况(等等,对于更多样品对)。观察2条目与过滤无关。 所以在上面的例子中,它最终看起来像:

sample observation1 observation2
    sample1A 10 x
    sample1A 20 x
    sample1B 7 h
    sample1B 22 s
    sample2A 11 g
    sample2A 14 g
    sample2A 20 h
    sample2B 30 t
    sample2B 40 a
    sample2B 50 h

当只有单个观察结果与每个样本相关联时,前面的解决方案(下面)工作,但现在每个样本可以有多行观察,我只想排除观察1在samplexA和samplexB之间匹配的行。 / p>

data %>%
  group_by(grp = substr(sample, 1, nchar(sample)-1)) %>%
  filter(n_distinct(observation1)>1) %>% 
  ungroup() %>%  
  select(sampleID, pos, grp)

如果我能澄清问题并提前致谢,请告诉我。

1 个答案:

答案 0 :(得分:3)

这是对代码的修改。我们可以group_by两列并计算每个组的数量,并筛选等于1的组计数。

library(dplyr)

dt2 <- dt %>% 
  group_by(grp = substr(sample, 1, nchar(sample) - 1), observation1) %>%
  filter(n() == 1) %>% 
  ungroup() %>%  
  select(-grp)

dt2
# A tibble: 10 x 3
     sample observation1 observation2
      <chr>        <int>        <chr>
 1 sample1A           10            x
 2 sample1A           20            x
 3 sample1B            7            h
 4 sample1B           22            s
 5 sample2A           11            g
 6 sample2A           14            g
 7 sample2A           20            h
 8 sample2B           30            t
 9 sample2B           40            a
10 sample2B           50            h

数据

dt <- read.table(text = "sample observation1 observation2
sample1A 10 x
                 sample1A 15 y
                 sample1A 20 x
                 sample1B 7 h
                 sample1B 15 a
                 sample1B 22 s
                 sample2A 10 g
                 sample2A 11 g
                 sample2A 14 g
                 sample2A 20 h
                 sample2B 10 a
                 sample2B 30 t
                 sample2B 40 a
                 sample2B 50 h",
                 header = TRUE, stringsAsFactors = FALSE)