Для цикла и условного оператора If не дает T / F - PullRequest
1 голос
/ 09 сентября 2011

Я ищу несколько больших файлов для повторяющихся записей генов. В моем списке генов есть несколько дубликатов и по крайней мере одна тройная запись. Я просто хочу иметь возможность узнать, какие строки повторяются!?!

Я получаю ошибку:

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 ]

4 голосов
/ 09 сентября 2011

Похоже, вы ищете дубликаты в одном векторе (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)

Вы можете объединить эти два направления, чтобы получить все дублированные элементы:

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 голос
/ 11 сентября 2011

Как писал @joran, вы должны использовать дубликаты.Но проблема в вашем коде из-за неправильной индексации ...

Когда вы индексируете вне массива, вы получаете NA обратно ...

Что-то вроде этого должно работать лучше:

for(i in seq_len(num_rows-1)) {
  for(j in (i+1):num_rows) {
    ...
1 голос
/ 09 сентября 2011

Ошибка «отсутствует значение там, где требуется ИСТИНА / ЛОЖЬ» возникает, если вы зададите if NA Я подозреваю, что либо

genes[i,1]

или

genes[j,1]

равно NA, то есть genes содержит NA с. Если вы хотите проверить равенство там, где может быть NA, вы можете использовать

identical(genes[i,1], genes[j,1])
0 голосов
/ 09 сентября 2011

Я предполагаю, что в ваших данных отсутствуют значения.Либо genes[i, 1], либо genes[j, 1] возвращает ноль, либо NA.сразу после сбоя выясните, каковы значения для i и j, а затем посмотрите на эту строку.Я подозреваю, что вы сможете вернуться к тому, что не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...