根据位于不同行的相同列值过滤 R 整洁数据框中的行

问题描述 投票:0回答:1

我正在尝试过滤掉样本中丰度计数低于对照中相同物种的物种 (ASV)。下面是我整理的数据表的简化版本:

ASV 身份证 类型 批量 计数
ASV1 控制23 Con1 B1 5000
ASV2 控制23 Con1 B1 2000
ASV1 样品21 S B1 4000
ASV2 样品21 S B1 6000
ASV1 样品28 S B1 10000
ASV2 控制25 Con25 B2 25000
ASV3 控制25 Con25 B2 9000
ASV2 样品12 S B2 70000
ASV3 样品12 S B2 26000
ASV2 样品10 S B2 3100

例如,我想从数据集中删除 Sample21 中的 ASV1,因为它的计数少于 B1 批次使用的 Control23。另一个例子:我想将 ASV2 保留在 Sample12 中,因为它的计数高于批次 B2 中 Control25 中相同物种的计数。

我一直在使用

tidyverse
来清理和分组我的数据,但我对如何对每批中的控件的 ASV 计数值进行子集化感到困惑。我认为使用
filter
会很简单,如下所示:

df_ASV.Tidy.Batch <- df_ASV.Tidy %>% 
   group_by(Batch, Type, ID, ASV) %>% 
   filter((Type != "S" & Counts > 0) > (Type != "C" & Counts > 0)) 

但输出仅确认了

Type != "S" & Counts > 0
的参数,而不确认
Type != "C"
且计数> 0,即使没有
Type != "C" & Counts > 0
,输出也是相同的。

我想我可能需要通过

mutate
summarise
创建一个新列以返回 TRUE 或 FALSE,然后使用
filter
,但它又回到了原来的问题,我不知道具体如何比较同一物种和批次的对照与样品的计数值。

如有任何建议,我们将不胜感激。谢谢!

r filter tidyverse subset bioinformatics
1个回答
0
投票

更改为

> df_ASV.Tidy %>% 
+   group_by(Batch, Type, ID, ASV) %>% 
+   filter(Type != "S", Type != "C", Counts > 0L) 
# A tibble: 4 × 5
# Groups:   Batch, Type, ID, ASV [4]
  ASV   ID        Type  Batch Counts
  <chr> <chr>     <chr> <chr>  <int>
1 ASV1  Control23 Con1  B1      5000
2 ASV2  Control23 Con1  B1      2000
3 ASV2  Control25 Con25 B2     25000
4 ASV3  Control25 Con25 B2      9000

数据

df_ASV.Tidy = read.table(h = T, text = "ASV     ID  Type    Batch   Counts
ASV1    Control23   Con1    B1  5000
ASV2    Control23   Con1    B1  2000
ASV1    Sample21    S   B1  4000
ASV2    Sample21    S   B1  6000
ASV1    Sample28    S   B1  10000
ASV2    Control25   Con25   B2  25000
ASV3    Control25   Con25   B2  9000
ASV2    Sample12    S   B2  70000
ASV3    Sample12    S   B2  26000
ASV2    Sample10    S   B2  3100
ASV2    Sample10    C   B2  3100  
ASV2    Sample10    K   B2  -3") # added last two lines
© www.soinside.com 2019 - 2024. All rights reserved.