如何找到连续n个连续零的索引 [英] How to find the indices where there are n consecutive zeroes in a row
问题描述
假设我有以下数据:
x = c(14,14, 6, 7 ,14 , 0 ,0 ,0 , 0, 0, 0 , 0 , 0, 0 , 0 , 0 , 0, 9 ,1 , 3 ,8 ,9 ,15, 9 , 8, 13, 8, 4 , 6 , 7 ,10 ,13, 3,
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, 4 , 7 ,4, 5 ,16 , 5 ,5 , 9 , 4 ,4, 9 , 8, 2, 0 ,0 ,0 ,0 ,0, 0, 0, 0 ,0 , 0, 0, 0, 0, 0, 0, 0, 0,0)
x
[1] 14 14 6 7 14 0 0 0 0 0 0 0 0 0 0 0 0 9 1 3 8 9 15 9 8
[26] 13 8 4 6 7 10 13 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[51] 0 0 0 0 0 0 0 0 4 7 4 5 16 5 5 9 4 4 9 8 2 0 0 0 0
[76] 0 0 0 0 0 0 0 0 0 0 0 0 0 0
我想恢复索引,该索引从连续3个以上的零开始,到在非零之前的最后0个结束。
I want to recover the indices beginning where there are more than 3 zeroes in a row and terminating with the last 0 before a nonzero.
例如,
我会得到
6,为17
推荐答案
这是两种基本的R方法:
Here are two base R approaches:
1)rle 首先运行 rle
,然后计算 ok
进行选择找出长度超过3的零序列。然后,我们计算所有重复序列的起始
和结束
,子集设置为 ok $
1) rle First run rle
and then compute ok
to pick out the sequences of zeros that are more than 3 long. We then compute the starts
and ends
of all repeated sequences subsetting to the ok
ones at the end.
with(rle(x), {
ok <- values == 0 & lengths > 3
ends <- cumsum(lengths)
starts <- ends - lengths + 1
data.frame(starts, ends)[ok, ]
})
给予:
starts ends
1 6 17
2 34 58
3 72 89
2)gregexpr 取每个数字的符号-将为0或1,然后将它们连接成一个长字符串。然后使用 gregexpr
查找至少四个零的位置。结果给出了起点和终点,可以从中加上 match.length
属性减去1。
2) gregexpr Take the sign of each number -- that will be 0 or 1 and then concatenate those into a long string. Then use gregexpr
to find the location of at least 4 zeros. The result gives the starts and the ends can be computed from that plus the match.length
attribute minus 1.
s <- paste(sign(x), collapse = "")
g <- gregexpr("0{4,}", s)[[1]]
data.frame(starts = 0, ends = attr(g, "match.length") - 1) + g
给予:
starts ends
1 6 17
2 34 58
3 72 89
这篇关于如何找到连续n个连续零的索引的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!