2015-01-16 3 views
1

두 개의 큰 행렬이 있는데이 두 행 사이에 유사성 점수를 계산하려고합니다. 그러나 공백을 포함하는 이러한 행렬에 몇 가지 열이 있으므로 행렬에서 gapsnogaps 벡터를 생성하고 그에 따라 점수를 계산하여 점수 매트릭스 (유사도 0에 대해 1)를 생성하는 함수를 작성했습니다.
함수의 득점 부분은 문제는 그 특정 열을 득점 할 때 시작 나는 다른 사람보다 더 관심이 오전 범위정수 (0)을 벡터에서 제거하는 방법은 무엇입니까?

ScoreMat <- align1 == align2 

    #find gaps and nogaps 
    gaps <- which(align1 == "-", arr.in=TRUE) 
    gaps <- gaps[,2] 
    gaps <-gaps[!duplicated(gaps) ] 
    nogaps <- 1:ncol(align1) 
    nogaps <- nogaps[-gaps] 

    #split ScoreMat into gaps and nogaps matrices 
    ScoreMatgaps  <- ScoreMat[,gaps] 
    ScoreMatNogaps <- ScoreMat[,nogaps] 

    #calculate score 
    gapScore <- rowSums(ScoreMatgaps) 
    nogapScore <- rowSums(ScoreMatNogaps) 
    score  <- cbind(gapScore,nogapScore) 

아래에서 볼 수 있습니다. 따라서 더 큰 함수에는 이러한 특정 범위를 채점하는 방법에 대한 선이 포함되어 있습니다. 그러나 이러한 범위 중 일부에는 간격이 있고 다른 일부에는 간격이 없습니다. 따라서 간격이있는 범위의 경우 함수가 제대로 작동합니다. 그러나 간격이없는 범위에서 gaps 벡터는 integer(0)으로 반환되며 어떤 이유로 인해 nogaps 벡터도 그 결과를 제공합니다.

다음과 같이 if 문을 사용하여 포함 된 문제를 해결하려고 시도한 :

gaps <- which(align1 == "-", arr.in=TRUE) 
    gaps <- gaps[,2] 
    gaps <- gaps[!duplicated(gaps) ] 
    nogaps <- 1:ncol(align1) 
    nogaps <- ifelse (length(gaps) == 0, nogaps, nogaps[-gaps]) 

을하지만 이것은 왜 if 문은이 결과를주고 1

동일하게 nogaps로 연결하는 방법과 내가 고칠 수 있니? 미리

답변

1

덕분 [ 연산자 부정적인 지표를 이용하여 조심. 가능한 한 많이 사용하지 않는 것이 좋습니다. 재현 할 수있는 예제를 제공하지 않았기 때문에 귀하의 문제를 구체적으로 말하지 않겠습니다. 다른 한편으로는, 문제는 다음과 같은 것으로 추측됩니다. 벡터가 있다고 가정하고 음수 값을 제거하고 싶습니다. 나는 다음을 할 수있다 :

v<-rnorm(100) 
indices<-which(v<0) 
v<-v[-indices] 

위의 동작은 문제가 없다. 이제는 음수 값이 없으므로 전체 벡터를 유지하려고한다고 가정합니다. 위의 절차를 수행하면 어떻게됩니까?

v<-1:10 
indices<-which(v<0) 
v<-v[-indices] 
v 
#integer(0) 

우리는 아무것도 가지고 있지 않습니다! x[-integer(0)]은 0 길이 벡터를 생성합니다. 해결책? 제거하려는 요소 대신 유지하려는 요소를 명시하십시오! 아주 간단합니다. 좋아요 :

#state the opposite condition 
indices<-which(v>=0) 
v<-v[indices] 

이것은 어떤 경우에도 작동합니다. 내 생각 엔 귀하의 문제는 nogaps[-gaps] 및 그와 유사한 줄에서 온 것입니다.

+0

제안 해 주셔서 감사합니다. 왜 내가 더 빨리 생각하지 않았는지 알 수 없습니다. –

+0

몇 시간 동안 내 머리를 긁은 후, 나는 당신의 제안이 효과가 없다는 결론에 도달했습니다. 이는 행렬의 모든 열에 틈이없는 몇 개의 행을 가지고 있기 때문에 (즉, 갭이있는 열과 갭이 모두 있음) 틈이없는 열을 찾는 것이 불가능하기 때문입니다. 수정 시도 (문제가있는 문제)로 내 질문을 업데이트합니다. –

+0

문제가 명확하지 않아 재현 할 수있는 예제와 원하는 출력을 제공해야합니다. 그러나 편집시에는 ifelse (벡터화 된 버전이며 필요하지 않음)가 아닌'if ... else'를 사용해야합니다. 'nogaps <- if (length (gaps) == 0) nogaps else nogaps [-gaps]' – nicola

관련 문제