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