2017-02-06 6 views
1

ベクトルの最も長い順序部分を抽出することを検討しています。したがって、このベクターを用いた例:ベクトルの最長順序部分の最初のインデックス

x <- c(1,2,1,0.5,1,4,2,1:10) 
x 
[1] 1.0 2.0 1.0 0.5 1.0 4.0 2.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 

私はいくつかの関数を適用したい、次のように返されます:

x_ord <- some_func(x) 
x_ord 
[1] 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 

私はベクトルがノーであるどの時点で判断するためにis.unsorted()を活用しようとしてきました長いソート。ここに私の厄介な試みであり、私がこれまで持っているものは:10を生産していない右x_ordとして

for(i in 1:length(x)){ 
    if(is.unsorted(x[i:length(x)])==TRUE){ 
    cat(i,"\n")} 
    else{x_ord=print(x[i])} 
} 

しかし、これは明らかです。私が最初に増加配列を同定する上で立ち往生していても今

x2 <- c(1,2,1,0.5,1,4,2,1:10,2,3) 

:私はまた、これは、より一般的にすると、このようなベクトル何かを同様後に順序付けられたシーケンスを非増えをカバーするために期待しています言及されたベクター。

アイデア?

+1

は、おそらくあなたは((X)> 0差分) '増加数の最長を見つける' RLEのような何かをしたいと。 – Gregor

+0

@Gregor - あなたは正しいです。私の見落とし。質問が反映されました。 – boshek

+0

@Gregor - これは次のようなものです: 'x':' x [(max(rle(diff(x)> 0)[["lengths"]]) - 1):length(x)] '少し乱雑です。しかし、それを最長シーケンスの後の数字を含む 'x2'に適用すると、右の最大インデックス(つまり、' length(x) ')に設定する方法がわからないので、それらの数字が出力に含まれます。 – boshek

答えて

3

これは動作するようです:

s = 1L + c(0L, which(x[-1L] < x[-length(x)]), length(x)) 
w = which.max(diff(s)) 

x[s[w]:(s[w+1]-1L)] 
# 1 2 3 4 5 6 7 8 9 10 

sは、実行が開始場所です、プラスlength(x)+1、便宜上:

  • 最初の実行がある1つの
  • その後の実行が開始から始まりますドロップ
  • length(x)+1をタックし、ベクトルが継続する場合は次の実行が開始されます

diff(s)は、runsの長さであり、which.maxは、最初の最大化を取り、結び目を破る。

s[w]は、選択した実行の開始点です。 s[w+1L]は次の実行の開始点です。選択された実行に属する番号を取得するには:s[w]:(s[w+1]-1L)


代わりに、分割し、目的のサブベクトルを選択:

sp = split(x, cumsum(x < c(-Inf, x[-length(x)]))) 
sp[[which.max(lengths(sp))]] 
# 1 2 3 4 5 6 7 8 9 10 
+0

もう少し注釈を付けることは可能ですか?それは確かにうまくいきますが、私は+/- 1Lのことではっきりと混乱しています。 – boshek

+0

@boshekオクラホマ、もう少しメモを追加しました。 '1L'は整数としてちょうど' 1'です。要素位置のベクトルでベクトルをサブセット化するときは、浮動小数点ではなく整数を使用するのが最善です。 – Frank

関連する問題