"分组/群集" R / python

时间:2016-10-31 14:05:26

标签: python r

我对以下问题有点挣扎。我想找到"分组/聚集"基于以下标准的1s区域:

从第1个位置开始,如果在1之后的窗口中(例如窗口长度== 5),则没有其他1,则输出的开始和结束位置为1。

  1. 之后窗口中没有其他1。

    0 0 0 0 0 1 0 0 0 0 0

  2. 开始< - 6

    结束< - 6

    但是,如果有1s我想将窗口滑动1,直到最后一个寡妇不再有1s。在那种情况下,start将是滑动开始的位置,end将是该区域的最后1位置。

    1. 之后的窗口还有其他1个。
    2. 0 0 0 0 0 1 0 0 1 1 1 1 0 1 0 1 0 0 0 0 0

      开始< - 6

      结束< - 16

      我有很多这样的矢量,随机分布1s(除了第一个位置总是1)。下面我提供了示例向量和首选输出。我宁愿在R中解决这个问题的解决方案(但是python也会很好)。我非常感谢你的帮助。

      以下是基于窗口长度的示例== 5:

      数字向量:

      1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 1 1 1 1 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1

      (1s的位置:1 15 62 63 67 86 252 272 334 335 337 344 348 349 350 357 360 361 362 363 365 367 371 373 391 396 406 410 412)

      输出:

      start< - 1 15 62 86 252 272 334 344 357 391 406

      结束< - 1 15 67 86 252 272 337 350 373 396 412

1 个答案:

答案 0 :(得分:1)

您可以通过运行长度编码向量来轻松完成此操作:

x <- c(1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
       0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
       1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,0,1,0,0,1,1,1,
       1,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
       0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1)

which(x == 1)
#[1]   1  15  62  63  67  88  89  91  98 102 103 104 111 114 115 116 117 119 121 125 127 145 150 160 164 166

window <- 5

#run length encoding
y <- rle(x)
#Run Length Encoding
#  lengths: int [1:37] 1 13 1 46 2 3 1 20 2 1 ...
#  values : num [1:37] 1 0 1 0 1 0 1 0 1 0 ...

#if run length for zeros is smaller than window replace with 1
y$values[(y$values == 0) & (y$lengths < window)] <- 1

#combine runs of ones
y <- rle(inverse.rle(y))

start <- cumsum(y$lengths)[y$values == 1] - y$lengths[y$values == 1] + 1
#[1]   1  15  62  88  98 111 145 160
end <- cumsum(y$lengths)[y$values == 1]
#[1]   1  15  67  91 104 127 150 166