【发布时间】:2021-05-31 23:10:04
【问题描述】:
我有一个数据框,其中包含沿基因组的每个碱基覆盖率。下面是一个小得多的示例版本:
> head(per_base_cov)
contig_id position coverage
1 contig_1 1 40
2 contig_1 2 33
3 contig_1 3 40
4 contig_1 4 32
5 contig_1 5 36
6 contig_1 6 30
7 contig_1 7 40
8 contig_1 8 38
9 contig_1 9 36
10 contig_1 10 40
11 contig_2 11 38
12 contig_2 12 39
13 contig_2 13 34
14 contig_2 14 39
15 contig_2 15 39
16 contig_2 16 32
17 contig_2 17 30
18 contig_2 18 37
19 contig_2 19 33
20 contig_2 20 35
我想计算每个重叠群、每 4 个位置并重叠 2 个位置的滑动窗口均值。我使用 dplyr 和 zoo 尝试了以下操作:
per_base_cov %>%
group_by(contig_id) %>%
mutate(cov.win.mean=rollapply(coverage,4,mean,by=2))
但我收到错误消息:
Error: Problem with `mutate()` input `cov.win.mean`.
x Input `cov.win.mean` can't be recycled to size 10.
ℹ Input `cov.win.mean` is `rollapply(coverage, 4, mean, by = 2)`.
ℹ Input `cov.win.mean` must be size 10 or 1, not 4.
ℹ The error occurred in group 1: contig_id = "contig_1".
有谁知道我该如何解决这个问题?我想要一个如下所示的输出:
contig_id mean_coverage
1 contig_1 36.25
2 contig_1 34.50
3 contig_1 36.00
4 contig_1 38.50
5 contig_2 37.5
6 contig_2 36
7 contig_2 34.5
8 contig_2 33.75
非常感谢。
【问题讨论】:
-
1.
rollapply的默认输出比输入向量短。检查length(rollapply(1:10, 3, mean))这就是您收到错误的原因。 2.您可以使用rollapplyr(1:10, 3, mean, fill = NA)或更短的rollmeanr(1:10, 3, fill = NA)。 3. 2000 步是什么意思? 4. 你能提供一个可重现的例子,比如 20 行数据并显示它的输出吗? -
嗨,如果我的原始帖子不清楚,很抱歉。我已经在上面更新了它并使其可重现。
-
更新:我使用了
per_base_cov %>% group_by(contig_id) %>% mutate(cov.win.mean=rollapply(coverage,4,mean,by=2, fill=NA)),这似乎给了我想要的东西。非常感谢! -
很高兴听到这个消息。我从未在
rollapply中使用过by参数。您可以将其添加为下面的答案。这可能对将来访问此帖子的人有所帮助。您可以回答自己的问题。
标签: r mean dplyr zoo sliding-window