私は一連の数値を持っています:1,2,3,7,8,9,12,13,14...
そして、各連続部分の最小値と最大値を取得したいので、結果は1-3,7-9,12-14
.
forループを使用して最小最大値を比較して取得できますが、1000万を超える数がある場合、この方法では時間がかかります...
私が欲しいものを手に入れるためのより速い方法があるかどうか誰かが知っていますか? ありがとう!
コメントで述べたように、diff
ギャップを特定するのに役立ちます。そのインデックスを使用して、ベクトルを分割し、各グループの最初と最後を抽出できます。
c(sapply(split(x, cumsum(c(T, diff(x)>1))), function(v) c(v[1], tail(v,1)*-1)))
[1] 1 -3 7 -9 12 -14
解決策はゴルフです。展開するために、各呼び出しを分離できます。
#Identify gaps in vector
changes <- cumsum(c(TRUE, diff(x) > 1L)
#Split vector on the above index
veclist <- split(x, changes)
#function to extract first item and the last item multiplied by -1
first_last <- function(v) c(v[1], tail(v,1)*-1)
#extract first and last from veclist
mat <- sapply(veclist, first_last)
#Remove list structure
c(mat)
[1] 1 -3 7 -9 12 -14