2015-01-29 2 views
0

I가 X찾기 숫자 소자 패턴의 R

x <- c(2, 28, 1, 31, 1, 10, 2, 1, 17, 4, 2, 5, 19, 6) 

I 내로 2 또는 1이고, 변환 X이어서 동일하거나 이상 7 시간 사이 세 번 이상 진동이 번호를 찾을 이것이 사실 일 때를 반영하는 0과 1

oscillates_more_than_once 
[1] 0 1 0 1 0 1 0 0 0 0 0 0 0 0 
7의 번호

그 위의

은 4 측면에 선다 이하 나는이에 해당하는 경우 반영하기 위해 0과 1로 X를 변환 할.

oscillates_once 
[1] 0 0 0 0 0 0 0 0 1 0 0 0 0 0 

그러나 숫자가 7을 초과하지만 5 이상인 경우 별도로 찾으시기 바랍니다.

flanked 
[1] 0 0 0 0 0 0 0 0 0 0 0 1 1 1 

이 문제를 해결하는 가장 좋은 방법은 패턴 일치입니까?

oscillates_more_than_once에서 시도해도 각 요소를 통과하지 않으므로 작동하지 않습니다.

if (length(x[x >= 7]) > 3) { 
test <- as.numeric(x >=7) 
lag.test <- c(tail(test,-1),NA) 
for (w in 1:length(test)) { 
    if (!(as.numeric(test[w]==lag.test[w])) && as.numeric(test[w]==1)) { 
    as.numeric(x >= 7) ###converts all of x not just those elements that oscillate 
    } 
    else { 
    as.numeric(!(x)) 
    } 
} 
} 
+0

한 번 확인하시기 바랍니다. 진동에 대해서는 잘 모르겠습니다. –

답변

1

은 다음을 시도해 볼 수도 있습니다 : 내 대답은 모든 기준을 충족하는 경우

library(dplyr) # for lead() 

#1 
y1 <- as.integer(x > 7 & lead(x) %in% 1:2) 
#[1] 0 1 0 1 0 1 0 0 0 0 0 0 0 0 

#2 
y2 <- as.integer(x >= 7 & (lead(x) <= 4 | lag(x) <= 4) & !y1) 
#[1] 0 0 0 0 0 0 0 0 1 0 0 0 0 0 

#3 
y3 <- as.integer((x >= 5 & (lead(x) > 7 | lag(x) > 7))| (x > 7 & lead(x) >= 5 & lag(x) >= 5)) 
#[1] 0 0 0 0 0 0 0 0 0 0 0 1 1 1