2011-12-14 8 views
3

いくつかのベクトルが「順次」であるかどうかをチェックするより良い方法があります。つまり、後続の要素の違いはまさに1です。そうでない場合Rのベクトルがシーケンシャルかどうかを確認しますか?

is.sequential <- function(x){ 
all(diff(x) == rep(1,length(x)-1)) 
}  

、他のHTHの誰か:私はここに

「is.sequential」のようには私自身の機能は何かが欠けていますように私は感じます。

+0

So 2:5はシーケンスと見なされますが、5:2はそうではありませんか? – Tommy

+0

... 'c(1.5,2.5,3.5)'と丸め誤差のシーケンスはどうですか? – Tommy

+0

@ Tommy。良い点。私の場合、整数だけが関連し、小数はありません。現時点では、私は後方シーケンスについてはあまり考えなかったが、興味深いことは認めている。 –

答えて

6

1がrecicledされますので、repは必要ありません:

編集5許可する:だからdiferent配列については

is.sequential <- function(x){ 
all(diff(x) == diff(x)[1]) 
} 
+0

恐ろしい "=="対 "all.equal"を注意してください! –

+0

@CarlWitthoft:そして、 "all.equal"との相違はありますか?http://stackoverflow.com/a/7667703/662787 :-) – Tommy

+0

@Tommy:私もコメントして以来、私たちは無限ループ〜_ * –

2

を可能にするには2真

is.sequential <- function(x){ 
    all(abs(diff(x)) == 1) 
} 

は@Iselzerは、良い答えがあります。ただし、丸め誤差と開始値はまだいくつかのコーナーケースがあります。丸め誤差を許容するが、最初の値が(ほぼ)整数であることを確認するバージョンがある。

is.sequential <- function(x, eps=1e-8) { 
    if (length(x) && isTRUE(abs(x[1] - floor(x[1])) < eps)) { 
    all(abs(diff(x)-1) < eps) 
    } else { 
    FALSE 
    } 
} 

is.sequential(2:5) # TRUE 

is.sequential(5:2) # FALSE 

# Handle rounding errors? 
x <- ((1:10)^0.5)^2 
is.sequential(x) # TRUE 

# Does the sequence need to start on an integer? 
x <- c(1.5, 2.5, 3.5, 4.5) 
is.sequential(x) # FALSE 

# Is an empty vector a sequence? 
is.sequential(numeric(0)) # FALSE 

# What about NAs? 
is.sequential(c(NA, 1)) # FALSE 
関連する問題