For循环和If条件语句不给T / F.

时间:2011-09-09 17:12:53

标签: r

我正在搜索几个大文件中的复制基因条目。在我的基因列表中有几个重复和至少一个triplcate条目。我只是希望能够找出代表什么行!'!

我收到错误:

Error in if (genes[i, 1] == genes[j, 1] && i != j) { : 
missing value where TRUE/FALSE needed

我遇到了障碍。

genes <- combine[c(4)]
num_rows <- nrow(genes)
dup_combine <- vector(mode="character", length=100)
n=1
for (i in 1:num_rows) {
only_check_rows <- num_rows-1
   for (j in i+1:only_check_rows) {
      if (genes[i,1] == genes[j,1]&&i!=j) {
         dup_combine[n] <- combine[i,1]
         n=n+1
         cat("i=",i,"j=",j,"\n")
      }
   }
}

4 个答案:

答案 0 :(得分:4)

看起来您正在单个向量(genes)中搜索重复项。有几种方法可以做到这一点。这是一些示例数据:

dat <- c(1,2,3,2,4,4,6,NA,8,NA,13)

table将计算dat中每个唯一值的出现次数。注意我使用exclude = NULL强制它计算NA值:

table(dat, exclude = NULL)

正如评论中所述,duplicated也适用。此函数返回一个布尔向量,具体指明哪些条目是之前条目的副本。 fromLast = TRUE告诉它从后到前看,而不是从前到后看。

duplicated(dat)
duplicated(dat, fromLast = TRUE)

您可以将这两个方向结合起来 all 重复的元素:

subset(dat, duplicated(dat) | duplicated(dat, fromLast = TRUE))

如果您正在使用数据框而不是单个向量,duplicated可能是最佳选择。

修改

以下是使用示例数据框的简短工作示例:

dat <- data.frame(x = c(1,2,3,4,4,5,6,5,9),
        y = c(2,3,1,2,2,6,2,6,10))
> dat
  x  y
1 1  2
2 2  3
3 3  1
4 4  2
5 4  2
6 5  6
7 6  2
8 5  6
9 9 10

#Boolean vector of duplicated rows
duplicated(dat)
[1] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE

#Indices of duplicated rows   
which(duplicated(dat))
[1] 5 8

#Look in both directions to get all dups (indices)
which(duplicated(dat) | duplicated(dat,fromLast = TRUE))
[1] 4 5 6 8

#The actual rows
subset(dat,duplicated(dat) | duplicated(dat, fromLast = TRUE))
  x y
4 4 2
5 4 2
6 5 6
8 5 6
  

答案 1 :(得分:1)

如果您提供if NA,则会出现错误“缺少值,其中需要TRUE / FALSE”。我怀疑是

genes[i,1]

genes[j,1]

NA,即genes中有NA个。{如果要在可能存在NA的位置测试相等性,可以使用

identical(genes[i,1], genes[j,1])

答案 2 :(得分:1)

正如@joran所写,你应该使用重复的。但是您的代码问题是因为索引错误......

当你在数组外面索引时,你会得到NA ...

这样的事情会更好:

for(i in seq_len(num_rows-1)) {
  for(j in (i+1):num_rows) {
    ...

答案 3 :(得分:0)

我的猜测是你的数据中缺少值。 genes[i, 1]genes[j, 1]返回null或NA。在它失败后,弄清楚i和j的值是什么,然后查看该行。我怀疑你能够回到错误的地方。