Как удалить все строки на основе цикла в R - PullRequest
0 голосов
/ 13 марта 2019

Я пишу цикл for для удаления строк, в которых все значения между строками 5 и 8 равны 'NA'. Тем не менее, он удаляет только некоторые строки. Когда я выполняю цикл while, он удаляет все строки, но я должен вручную завершить его (т. Е. Это бесконечный цикл ... Я также понятия не имею, почему)

Цикл for / if:

     for(i in 1:nrow(df)){
if(is.na(df[i,5]) && is.na(df[i,6]) && 
    is.na(df[i,7]) && is.na(df[i,8])){
  df<- df[-i,]
}
  }

цикл while (но он бесконечен):

 for(i in 1:nrow(df)){
    while(is.na(df[i,5]) && is.na(df[i,6]) && 
        is.na(df[i,7]) && is.na(df[i,8])){
      df<- df[-i,]
    }
      }

Может кто-нибудь помочь? Спасибо!

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Здесь происходит следующее: когда вы удаляете строку таким образом, все строки под ней «сдвигаются» вверх, чтобы заполнить оставшееся пространство. Когда есть повторяющиеся строки, которые должны быть удалены, вторая пропускается. Представьте себе эту таблицу:

1 keep
2 delete
3 delete
4 keep

Теперь вы перебираете последовательность от 1 до 4 (количество строк), удаляя строки с надписью delete:

i = 1, оставьте этот ряд ...

i = 2, удалите эту строку. Теперь фрейм данных выглядит следующим образом:

1 keep
2 delete
3 keep

i = 3, в третьем ряду написано сохранить, так что сохраните ... Последняя таблица:

1 keep
2 delete
3 keep

В вашем примере с while, однако, шаг удаления продолжает выполняться в строке 2, пока эта строка не удовлетворяет условиям, вместо того, чтобы сразу перейти к i = 3. Итак, процесс идет:

i = 1, оставьте этот ряд ...

i = 2, удалите эту строку. Теперь фрейм данных выглядит следующим образом:

1 keep
2 delete
3 keep

i = 2 (снова), удалите эту строку (снова). Теперь фрейм данных выглядит следующим образом:

1 keep
2 keep

i = 2 (снова), в этом ряду написано сохранить, поэтому сохраните его и перейдите к i = 3


Было бы упущением ответить на этот вопрос, не упоминая, что есть много лучших способов сделать это в R, таких как обозначение в квадратных скобках (введите ?`[` в консоли R), filter функция в пакете dplyr или в пакете data.table.

Этот вопрос имеет много вариантов: Фильтрация строк data.frame по логическому условию

0 голосов
/ 14 марта 2019

Сохранить номер строки в векторе и удалить вне цикла.

test <- iris
test[1:5,2:4] <- NA

> head(test)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1          NA           NA          NA  setosa
2          4.9          NA           NA          NA  setosa
3          4.7          NA           NA          NA  setosa
4          4.6          NA           NA          NA  setosa
5          5.0          NA           NA          NA  setosa
6          5.4         3.9          1.7         0.4  setosa

x <- 0


for(i in 1:nrow(test)){
if(is.na(test[i,2]) && is.na(test[i,3]) && 
    is.na(test[i,4])){
  x <- c(x,i)
  }
}
  x
  test<- test[-x,]
  head(test) 

> head(test)
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
6           5.4         3.9          1.7         0.4  setosa
7           4.6         3.4          1.4         0.3  setosa
8           5.0         3.4          1.5         0.2  setosa
9           4.4         2.9          1.4         0.2  setosa
10          4.9         3.1          1.5         0.1  setosa
11          5.4         3.7          1.5         0.2  setosa
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...