这是前一个问题的后续内容,其中我之前的解决方案似乎不适用于更复杂的数据集。 上一个问题: 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)
如果我能澄清问题并提前致谢,请告诉我。
答案 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)