2016-11-01 5 views
-1

하나의 요소가 이전 요소와 같은지 확인하기 위해 논리 벡터를 만들려고합니다.한 요소가 이전 요소와 동일한 지 확인하십시오. R

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

나는 그것이 이전과 동일한의 경우 각 요소를 확인하고 싶습니다 그러므로 resuld은 다음과 같아야합니다

FALSE TRUE FALSE TRUE TRUE FALSE TRUE 

을 내가, 내가 루프를 만들 수 알고 난이 (가 효율적 아니다 꾸물 거리지 1600 만 df). 그래서

그것은 이상적인 건 아니지만, 내가 관리 할 수있는 것입니다 :

for(i in 2:length(vector)) {print(vector[i] == vector[i-1])} 

영원히 걸릴 것이라고. 거기에 어떤 vectorized 방법이 있습니까?

+1

또는'c (FALSE, head (vector, -1) == tail (vector, -1)) ' – rawr

+0

다음과 같이 할 수도 있습니다 :'c (FALSE, vector [-1] == 벡터 [-length)])'. – nicola

+0

이 작동하면, 단지 하나의 적용'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)]) 

를 사용할 수 있습니다.

관련 문제