r - 如果给定组的所有成员都不存在,我想使用 dplyr 过滤数据框

标签 r dplyr

我有一个以制表符分隔的细菌菌株名称和基因二进制矩阵,列为存在 (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/

相关文章:

r - 除了第 2 列的 NA 值外,如何用第 2 列覆盖第 1 列的值?

r - 将行与列匹配并计算相同的出现次数 R

R 按位置将字符串列分成两列

R 代码 : quickly finding the pattern & its repeats within a vector of string

mysql - 如何将 Rstudio 连接到 mysql 数据库的 AWS 实例?

在 R 中有效地替换多个值并保持其他值相同

r - 使用 case_when 突变 - 多个 LHS/RHS OR 评估

r - 如何在 R 中构建一次汇总多个值的表

r - 错误: 'across' is not an exported object from 'namespace:collapse'

r - 颜色数 = 类别数的 plotly 条形图