gpt4 book ai didi

r - 如何找到连续有 n 个连续零的索引

转载 作者:行者123 更新时间:2023-12-04 02:40:27 24 4
gpt4 key购买 nike

假设我有这个数据:

  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 终止的索引。

例如,

我会得到

6、17 表示第一批零等。

最佳答案

以下是两种基本的 R 方法:

1) rle 首次运行 rle然后计算 ok挑选出长度超过 3 的零序列。然后我们计算 startsends所有重复序列的子集为 ok最后的那些。

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找到至少 4 个零的位置。结果给出了起点和终点,可以从它加上 match.length 计算出来。属性减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

关于r - 如何找到连续有 n 个连续零的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50311720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com