두 개의 큰 행렬이 있는데이 두 행 사이에 유사성 점수를 계산하려고합니다. 그러나 공백을 포함하는 이러한 행렬에 몇 가지 열이 있으므로 행렬에서 gaps
및 nogaps
벡터를 생성하고 그에 따라 점수를 계산하여 점수 매트릭스 (유사도 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
로 연결하는 방법과 내가 고칠 수 있니? 미리
제안 해 주셔서 감사합니다. 왜 내가 더 빨리 생각하지 않았는지 알 수 없습니다. –
몇 시간 동안 내 머리를 긁은 후, 나는 당신의 제안이 효과가 없다는 결론에 도달했습니다. 이는 행렬의 모든 열에 틈이없는 몇 개의 행을 가지고 있기 때문에 (즉, 갭이있는 열과 갭이 모두 있음) 틈이없는 열을 찾는 것이 불가능하기 때문입니다. 수정 시도 (문제가있는 문제)로 내 질문을 업데이트합니다. –
문제가 명확하지 않아 재현 할 수있는 예제와 원하는 출력을 제공해야합니다. 그러나 편집시에는 ifelse (벡터화 된 버전이며 필요하지 않음)가 아닌'if ... else'를 사용해야합니다. 'nogaps <- if (length (gaps) == 0) nogaps else nogaps [-gaps]' – nicola