Найдите разрыв между двумя последовательными ненулевыми данными - PullRequest
0 голосов
/ 18 июня 2020

У меня есть фрейм данных a с некоторыми 0 и ненулевыми значениями. Например:

0,2,6,1,0,0,0,5,4,0,0,3,3,0,0,2,0,0,7, 1,4,0,7,0,5,6,0,0,0

Мне нужно найти длину между последовательными ненулевыми вхождениями . Я попытался реализовать which (a! = 0), используя его внутри al oop, но не могу заставить его работать для последовательных критериев. Результат должен выглядеть так:

4,3,6,4

Обратите внимание, что ненулевые данные не будут учитываться, если они не идут подряд другие ненулевые данные.

Edit :::

Извините за запутанный вывод в вопросе. Я делал +1 в каждом выводе, потому что мой фрейм данных - это время между двумя дождливыми днями подряд. Вывод также может быть:

3,2,5,3

Но главное, что «если между двумя нулями есть только одно ненулевое значение, оно не будет засчитываться» как «ненулевые значения, не смежные с другими. ненулевые значения следует рассматривать как нули ". (Как 16 пункт 2).

Ответы [ 2 ]

1 голос
/ 18 июня 2020
x = c(0,2,6,1,0,0,0,5,4,0,0,3,3,0,0,2,0,0,7,1,4,0,7,0,5,6,0,0,0)

xt = x
# replace lone non-0s with 0
xt[which(lag(x) == 0 & lead(x) == 0)] = 0

# use RLE, ignoring the first element
with(rle(xt == 0), lengths[c(-1, -length(lengths))][values[c(-1, -length(lengths))]]) + 1
# [1] 4 3 6 4 
1 голос
/ 18 июня 2020

Этого должно хватить

vector_c <- c(0,2,6,1,0,0,0,5,4,0,0,3,3,0,0,2,0,0,7,1,4,0,7,0,5,6,0,0,0)

x <- rle(vector_c == 0)

x$values
x$lengths

x$lengths[x$values]
...