我对以下问题有点挣扎。我想找到"分组/聚集"基于以下标准的1s区域:
从第1个位置开始,如果在1之后的窗口中(例如窗口长度== 5),则没有其他1,则输出的开始和结束位置为1。
之后窗口中没有其他1。
0 0 0 0 0 1 0 0 0 0 0
开始< - 6
结束< - 6
但是,如果有1s我想将窗口滑动1,直到最后一个寡妇不再有1s。在那种情况下,start将是滑动开始的位置,end将是该区域的最后1位置。
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
答案 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