【问题标题】:Sliding window means with dplyr & zoo滑动窗口意味着与 dplyr & zoo
【发布时间】: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


【解决方案1】:

在 Ronak 的帮助下,我设法找到了解决方案:

win_means <- per_base_cov %>%
  group_by(contig_id) %>%
  mutate(cov.win.mean=rollapply(coverage,4,mean,by=2, fill=NA))

win_means_complete <- win_means[complete.cases(win_means), ]
win_means_final <- win_means_complete[,c(1,2,4)]
win_means_final <- as.data.frame(win_means_final)

head(win_means_final)

  contig_id position cov.win.mean
1 contig_1   2        36.25
2 contig_1   4        34.50
3 contig_1   6        36.00
4 contig_1   8        38.50
5 contig_2  12        37.50
6 contig_2  14        36.00

【讨论】:

    猜你喜欢
    • 2011-01-10
    • 2021-12-22
    • 2012-05-23
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2020-05-31
    • 2015-11-07
    • 2018-08-20
    相关资源
    最近更新 更多