我正在尝试过滤掉样本中丰度计数低于对照中相同物种的物种 (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
,但它又回到了原来的问题,我不知道具体如何比较同一物种和批次的对照与样品的计数值。
如有任何建议,我们将不胜感激。谢谢!
更改为
> 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