【问题标题】:How to remove integer(0) from a vector?如何从向量中删除整数(0)?
【发布时间】:2015-01-16 09:08:58
【问题描述】:

我有两个大矩阵,我想计算两者之间的相似度分数。但是,这些矩阵中有一些列包含间隙,所以我所做的是编写一个函数,该函数创建一个得分矩阵(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 语句会给出这个结果,我该如何解决?

提前致谢

【问题讨论】:

    标签: r function matrix vector


    【解决方案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] 和类似的行。

    【讨论】:

    • 谢谢你的建议,不知道为什么没有早点想到!
    • 在摸索了一个小时后,我得出的结论是您的建议不起作用。这是因为我的矩阵中的所有列都有几行没有间隙(换句话说,有间隙的列既有间隙又有数据),所以根本不可能找到没有间隙的列。我将用我的修复尝试更新我的问题(我遇到了问题)
    • 您应该提供一个可重现的示例和您想要的输出,因为您的问题不清楚。但是,在您的编辑中,您应该使用if ... else 而不是ifelse(这是一个矢量化版本,不需要)。试试nogaps &lt;- if (length(gaps) == 0) nogaps else nogaps[-gaps]
    • 感谢 nicola 的帮助,'if... else' 非常适合我需要做的事情。再次感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多