如何从向量中删除整数(0)?
How to remove integer(0) from a vector?
我有两个大矩阵,我想计算两者之间的相似度分数。但是,这些矩阵中的某些列包含间隙,所以我所做的是编写一个函数来创建分数矩阵(1 表示相似性,0 表示不相似性),然后从矩阵中创建 gaps
和 nogaps
向量并据此计算分数
该函数的评分部分如下所示
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
向量 returns 和 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 语句会给出这个结果,我该如何解决?
提前致谢
注意在 [
运算符中使用负索引。我强烈建议尽可能避免使用它们。我不会具体谈论你的问题,因为你没有提供可重现的例子。另一方面,我猜想问题出在以下方面。假设我有一个向量,我想删除负值。我可以做到以下几点:
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]
和类似的行。
我有两个大矩阵,我想计算两者之间的相似度分数。但是,这些矩阵中的某些列包含间隙,所以我所做的是编写一个函数来创建分数矩阵(1 表示相似性,0 表示不相似性),然后从矩阵中创建 gaps
和 nogaps
向量并据此计算分数
该函数的评分部分如下所示
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
向量 returns 和 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 语句会给出这个结果,我该如何解决?
提前致谢
注意在 [
运算符中使用负索引。我强烈建议尽可能避免使用它们。我不会具体谈论你的问题,因为你没有提供可重现的例子。另一方面,我猜想问题出在以下方面。假设我有一个向量,我想删除负值。我可以做到以下几点:
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]
和类似的行。