使用滑动窗口对data.frame中的值进行计数,该范围内的值

时间:2019-04-02 23:08:54

标签: r

我正在分析数据,我想计算一行包含另一个字段指定的范围内特定字段组合的出现次数。我对R还是比较陌生,还无法找出滑动窗,看起来像是这样。

我想要的非代码是:
-前200 bp(第2列)在正链(第6列)上出现“ m4C”(第1列)的次数
-对下一个200 bp(或我要选择的任何窗口大小)重复上述操作。
一旦我掌握了基本的代码段,我还将进行修改以查看其他类型的修改以及这两个方面。

我看过动物园的rollapply,但不知道如何为这种条件组合制作函数。我也看到了这个https://stats.stackexchange.com/questions/3051/mean-of-a-sliding-window-in-r
,但我还不了解将它移到那里使用的简单功能之外的地方。我已经找到一种使用COUNTIFS在Excel中执行此操作的方法

COUNTIFS($A:$A,"m4C",$F:$F,"+",$B:$B,">"&$S3,$B:$B,"<"&$T3)

其中对列S和T的调用指定了窗口的上限和下限,但是出于某些原因,我想使用R。

示例数据:

type    start   end seqid   score   strand
m6A 2   2   NC_002932.3 44  -
modified_base   20  20  NC_002932.3 41  -
m6A 57  57  NC_002932.3 451 -
modified_base   69  69  NC_002932.3 55  +
m6A 80  80  NC_002932.3 540 +
modified_base   93  93  NC_002932.3 55  +
m4C 139 139 NC_002932.3 37  +
m6A 196 196 NC_002932.3 422 +
m4C 200 200 NC_002932.3 40  +
m6A 204 204 NC_002932.3 571 -
m6A 210 210 NC_002932.3 477 -
m6A 255 255 NC_002932.3 500 -
modified_base   264 264 NC_002932.3 32  +

以上所需的输出:
0-200 1
200-400 1

实际文件有成千上万行。在此先感谢您的帮助。我将数据作为制表符分隔的文件,我很高兴将其读取为任何形式,以获得所需的内容,但是一直在使用data.frame,因为到目前为止,这是我所知道的。

1 个答案:

答案 0 :(得分:0)

这是一种dplyr的方法:

library(dplyr)
df2 <- df %>%
  group_by(grp = start %/% 200 + 1) %>%
  summarize(min = min(start),
            max = max(start),
            count = sum(type == "m4C")) 
#> df2
## A tibble: 2 x 4
#    grp   min   max count
#  <dbl> <dbl> <dbl> <int>
#1     1     2   196     1
#2     2   200   264     1



# additional step to match output more closely
df2 %>%
  mutate(group = paste0(min, "-", max)) %>%
  select(group, count)

## A tibble: 2 x 2
#  group   count
#  <chr>   <int>
#1 2-196       1
#2 200-264     1

加载数据:

df <- read.table(
  header = T, 
  stringsAsFactors = F,
  text = "type    start   end seqid   score   strand
m6A 2   2   NC_002932.3 44  -
modified_base   20  20  NC_002932.3 41  -
m6A 57  57  NC_002932.3 451 -
modified_base   69  69  NC_002932.3 55  +
m6A 80  80  NC_002932.3 540 +
modified_base   93  93  NC_002932.3 55  +
m4C 139 139 NC_002932.3 37  +
m6A 196 196 NC_002932.3 422 +
m4C 200 200 NC_002932.3 40  +
m6A 204 204 NC_002932.3 571 -
m6A 210 210 NC_002932.3 477 -
m6A 255 255 NC_002932.3 500 -
modified_base   264 264 NC_002932.3 32  +")