2014-05-01 3 views
0

질문이 있습니다. 나는 두 개의 행으로 구성된 테이블을 가지고있다.R에서 공유 시퀀스 길이 찾기

00012121000012100110021212012121 
11220212121221121212121212200000 
    -    -  - 

숫자가있는 두 줄 아래의 줄은 설명을위한 것이다. 중간에있는 두 행을 비교해보고 두 개의 호환되지 않는 정류장 2/0 (왼쪽)과 0/2 오른쪽의 위치를 ​​찾으십시오. 다른 방법으로도 가능합니다 (2/0은 오른쪽, 0/2는 왼쪽에 있음). 나는 다른 곳에서 시작하여 중간에서 시작하는 위치를 안다. 쉬운 방법은 왼쪽에 2/0 또는 0/2를 찾고 오른쪽에 0/2 2/0 (왼쪽에 무엇인가에 따라 다름)을 찾을 수 있습니까? 그리고 그것은 그 일을 가장 효율적인 방법이 아니다/

답변

1

위치를 알 수 있지만 간단한 인덱스 비교를 사용할 수있는, 예컨대 :

s <- c("00012121000012100110021212012121", 
     "11220212121221121212121212200000", 
     " -    -  -  ") 
l <- strsplit(s, "") 
l[1:2] <- lapply(l[1:2], as.numeric) 

d <- l[[1]]-l[[2]] 
# [1] -1 -1 -2 -1 2 -1 1 -1 ... 

## stop rule left: 2/0 => 2 
stopsleft <- which(d == 2) 
# [1] 5 29 31 

## stop rule right: 0/2 => -2 
stopsright <- which(d == -2) 
# [1] 3 10 12 16 20 27 

middlepos <- 19 

stopleft <- tail(stopsleft[stopsleft < middlepos], 1) 
# [1] 5 

stopright <- head(stopsright[stopsright > middlepos], 1) 
# [1] 20 

target <- grep("-", l[[3]]) 
# [1] 5 19 27 

내 오른쪽 정지 위치가 당신과 다른 것이 있습니다. 나는 왜 당신이 20 대신에 위치 27을 선택하는지 모르겠습니다.

+0

오 당신은 정지 위치에 있습니다. 이 코드에서 어떤 패턴 (0/2) 또는 (2/0)이 왼쪽의 오른쪽에 있습니까? – user3419669

+0

따라서'which (d == 2)'/'which (d == -2)'를 적절하게 조정해야합니다. 또는 주문이 중요하지 않은 경우'which (abs (d) == 2)'를 사용하십시오. – sgibb

+0

당신은 그 대답에 잠재적으로 업데이트 될 수 있습니까? 또한 데이터가 이미 행렬에 없다면 시작 부분의 strsplit 단계를 제거 할 수 있습니까? – user3419669