如何从向量中删除整数(0)?

时间:2015-01-16 09:08:58

标签: r function matrix vector

我有两个大矩阵,我想计算两者之间的相似度得分。但是,这些矩阵中有一些列包含间隙,所以我所做的就是编写一个函数,创建一个得分矩阵(1表示相似性0表示不相似性),然后从矩阵中创建gapsnogaps个向量并相应地计算得分 该功能的得分部分见下文

  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])

但这导致nogaps等于1

为什么if语句会给出这个结果,我该如何修复它?

提前致谢

1 个答案:

答案 0 :(得分: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]和类似的行。