Вот основа R решение сильно полагаться на ?diff
: ответ
data <- c(1,4,6,7,8,9,20,30,31,32,33,34,35,60)
diff1 <- diff(data[1:(length(data)-1)]) # lag 1 difference
diff2 <- diff(data, 2) # lag 2 difference
# indices of starting consecutive stretches -- these will overlap
start_index <- which(diff1==1 & diff2==2)
end_index <- start_index + 2
# notice that these overlap:
data.frame(start_index, end_index)
# To remove overlap:
# We can remove *subsequent* consecutive start indices
# and *initial* consecutive end indices
start_index_new <- start_index[which(c(0, diff(start_index))!=1)]
end_index_new <- end_index[which(c(diff(end_index), 0) != 1)]
data.frame(start_index_new, end_index_new)
# start_index_new end_index_new
# 1 3 6
# 2 8 13
Кори велик - это один может быть просто немного легче понять, потому что вы в основном проверяете случаи, когда с позиции i
позиция i+1
имеет значение еще 1 и позиция i + 2
имеет значение 2. Вы строите диапазоны от этого, а затем объединяете диапазоны с другой функцией diff
. По-моему, это немного проще.
Есть также пакеты, которые вы можете использовать как zoo
, которые могут помочь вам получить разницу в качении.
http://stackoverflow.com/questions/29184297/finding-the-start-and-stop-indices-in-sequence-in-r – Khashaa
возможно, если вы посмотрите на 'rle()' и разницу в запаздывании. Если они являются последовательными значениями, разница в запаздывании будет равна 1. Посмотрите на последовательности из 1 в этом с помощью 'rle()' – cory