2016-11-01 9 views
-1

1つの要素が前の要素と等しいかどうかを確認するために論理ベクトルを作成しようとしています。1つの要素が前の要素と等しいかどうかを確認します。R

vector <- c(1, 1, 2, 2, 2, 3, 3) 

私はそれが以前と同じだ場合は、各要素をチェックしたいのですが、そのためresuldは次のようになります。

FALSE TRUE FALSE TRUE TRUE FALSE TRUE 

を、私は、私はループを作ることができる知っている私が持っている(それは効率的ではありません言い訳1,600万行のdf)。 だから、

それは理想的ではないですが、私が管理できるものである:

永遠にかかるだろう
for(i in 2:length(vector)) {print(vector[i] == vector[i-1])} 

。それを行うベクター化された方法はありますか?

+1

または 'c(FALSE、head(vector、-1)== tail(vector、-1))' – rawr

+0

'c(FALSE、vector [-1] == vector [-length )]) ' – nicola

+0

が動作するならば、ただ1つのアダプテーション 'c(FALSE、!diff(x)> 0)'が必要です。 これを文字ベクトルにどうやったらいいですか? –

答えて

2

ここにはdata.tableの回答があります。最初の項目は実際にはNAであることに注意してください。必要に応じて手動で編集することができます。

我々は(整数ベクトルのためのより良い)を使用することができます
library("data.table") 
vector <- c(1, 1, 2, 2, 2, 3, 3) 

df <- data.frame(original=vector) 
setDT(df) 
df[, prev_eq := vector==shift(vector,1)] 
2

c(FALSE, diff(x) == 0) 

x <- c(1L, 1L, 2L, 2L, 2L, 3L, 3L) 

c(FALSE, diff(x) == 0) 
#[1] FALSE TRUE FALSE TRUE TRUE FALSE TRUE 

あなたのベクトルは浮動小数点数が含まれている場合、これは、より堅牢である。

c(FALSE, abs(diff(x)) < .Machine$double.eps^0.5) 

しかし、これは実際には巨大なベクターの場合の3倍以上のメモリ、おそらくは3倍の遅れがあります。あなたは文字ベクトルを持っている場合は


、我々は"=="を使用して文字列を比較することが常に安全である

c(FALSE, x[-1] == x[-length(x)]) 

を使用することができます。

関連する問題