我有一个以制表符分隔的细菌菌株名称和基因二进制矩阵,列为存在 (1) 或不存在 (0),由 ROARY(pangenome 管道)输出。
这是数据的模拟版本:
strain <- rep(letters[1:4], 5)
gene <- c(rep("G1", 4), rep("G2", 4), rep("G3", 4), rep("G4", 4), rep("G5", 4))
pres_abs <- c(1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1)
test <- tibble(strain, gene, pres_abs)
strain gene pres_abs
<chr> <chr> <dbl>
1 a G1 1
2 b G1 1
3 c G1 1
4 d G1 1
5 a G2 1
6 b G2 1
7 c G2 0
8 d G2 0
9 a G3 0
10 b G3 0
11 c G3 1
12 d G3 1
13 a G4 0
14 b G4 0
15 c G4 0
16 d G4 1
17 a G5 1
18 b G5 0
19 c G5 1
20 d G5 1
顺便说一句,当我使用 read_tsv()
将它读入 R 时,它的结构是这样的:
gene a b c d
<chr> <dbl> <dbl> <dbl> <dbl>
1 G1 1 1 1 1
2 G2 1 1 0 0
3 G3 0 0 1 1
4 G4 0 0 0 1
5 G5 1 0 1 1
我的矩阵中有几千个基因和大约 30 个菌株。
我想识别菌株的某个子集中不存在 (0) 的所有基因,并将它们保存为向量(列表?)以用于进一步分析(例如,作为类似数据框的过滤器项) .
对于上面的示例,我只想要菌株 a 和菌株 b 中都不存在的基因(因此存在于 c 和/或 d 中)。所以我希望得到 G3 和 G4 基因。
在搜索了一些解决方案后,我使用 pivot_longer
延长了数据,使其结构类似于我的示例中的 test
。我试着像这样过滤:
test %>% filter(strain %in% c("a", "b") & pres_abs == 0)
它给出了我想要的 G3 和 G4,但也给出了 G5,因为它存在于基因 a 中。
strain gene pres_abs
<chr> <chr> <dbl>
1 a G3 0
2 b G3 0
3 a G4 0
4 b G4 0
5 b G5 0
有人可以帮我正确过滤条件吗?
最佳答案
这是我们对您感兴趣的菌株的 pres_abs
求和的一种方式。
test %>%
group_by(gene) %>%
filter(sum(pres_abs[strain %in% c("a", "b")]) == 0)
# # A tibble: 8 x 3
# # Groups: gene [2]
# strain gene pres_abs
# <chr> <chr> <dbl>
# 1 a G3 0
# 2 b G3 0
# 3 c G3 1
# 4 d G3 1
# 5 a G4 0
# 6 b G4 0
# 7 c G4 0
# 8 d G4 1
以上返回这些菌株的所有观察结果。或者,您可以进行两步过滤:
test %>%
group_by(gene) %>%
filter(strain %in% c("a", "b")) %>%
filter(sum(pres_abs) == 0)
# # A tibble: 4 x 3
# # Groups: gene [2]
# strain gene pres_abs
# <chr> <chr> <dbl>
# 1 a G3 0
# 2 b G3 0
# 3 a G4 0
# 4 b G4 0
关于r - 如果给定组的所有成员都不存在,我想使用 dplyr 过滤数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67893730/