R/python中向量中的“分组/聚集”区域

2024-03-29 14:35:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有点纠结于下面的问题。我希望根据以下条件找到具有1的“分组/群集”区域:

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

  1. 之后窗口中没有其他1。你知道吗

    0 0 0 0 0 1 0 0 0 0 0

开始<;-6

结束<;-6

但是,如果有1,我想滑动窗口的1点,直到没有1在最后的寡妇了。在这种情况下,起点是滑动起点的位置,终点是该区域最后一个1的位置。你知道吗

  1. 后面的窗口中还有其他1。你知道吗

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

开始<;-6

结束<;-16

我有很多这样的向量,随机分布为1(除了第一个位置总是1)。下面我提供了示例向量和首选输出。我更喜欢用R来解决这个问题(但python也可以)。我非常感谢你的帮助。你知道吗

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

数字向量:

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 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 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1

(1的位置: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)

输出:

开始<;-1 15 62 86 252 272 334 344 357 391 406

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


Tags: lt区域示例情况数字条件向量群集
1条回答
网友
1楼 · 发布于 2024-03-29 14:35:42

通过对向量进行游程编码,您可以很容易地做到这一点:

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

相关问题 更多 >