У меня есть фрейм данных с именем "mydata", который выглядит так:
A B C D
1. 5 4 4 4
2. 5 4 4 4
3. 5 4 4 4
4. 5 4 4 4
5. 5 4 4 4
6. 5 4 4 4
7. 5 4 4 4
Я хотел бы удалить строку 2,4,6. Например, вот так:
A B C D
1. 5 4 4 4
3. 5 4 4 4
5. 5 4 4 4
7. 5 4 4 4
Ответы:
Основная идея заключается в том, что вы формируете набор строк, которые хотите удалить, и сохраняете дополнение этого набора.
В R дополнение множества задается оператором '-'.
Итак, предположим, что
data.frame
называетсяmyData
:Конечно, не забудьте «переназначить»,
myData
если вы хотите полностью удалить эти строки - в противном случае R просто печатает результаты.источник
,
там! ;)drop = FALSE
туда.-
его, он не будет работать, потому что оператор дополнения для логики есть!
. Дополнение c (2,4,6) в строках, скорее всего, было бы setdiff (c (2,4,6), 1: nrow (myData)), которое не является c (-2, -4, -6) , хотя оба будут давать одинаковые строки при использовании с[
.myData[-c(2, 4, 6),,drop=F]
. На самом деле, я хотел бы предложить, чтобы вы всегда вставляли,drop=F
непосредственно перед]
любым матричным доступом.Вы также можете работать с так называемым логическим вектором, иначе
logical
:Обратите внимание, что
!
оператор действует как НЕ, то есть!TRUE == FALSE
:Это кажется немного громоздким по сравнению с ответом @ mrwab (+1 btw :)), но логический вектор может быть сгенерирован на лету, например, когда значение столбца превышает определенное значение:
Вы можете преобразовать логический вектор в вектор индексов:
Наконец, очень интересный трюк заключается в том, что вы можете использовать этот вид поднабора не только для извлечения, но и для назначения:
где столбец
A
назначенNA
(не число), гдеA
превышает 4.источник
Проблемы с удалением по номеру строки
Для быстрого и грязного анализа вы можете удалить строки data.frame по номерам согласно верхнему ответу. То есть,
Однако, если вы пытаетесь написать надежный сценарий анализа данных, вам, как правило, следует избегать удаления строк по числовой позиции. Это связано с тем, что в будущем порядок строк в ваших данных может измениться. Общий принцип таблиц data.frame или базы данных заключается в том, что порядок строк не должен иметь значения. Если порядок имеет значение, это должно быть закодировано в фактической переменной в data.frame.
Например, представьте, что вы импортировали набор данных и удалили строки по числовой позиции после проверки данных и определения номеров строк, которые вы хотите удалить. Однако в какой-то момент вы переходите к необработанным данным, осматриваетесь и переупорядочиваете данные. Ваш код удаления строк теперь удалит неправильные строки, и, что еще хуже, вы вряд ли получите какие-либо ошибки, предупреждающие вас о том, что это произошло.
Лучшая стратегия
Лучшая стратегия состоит в том, чтобы удалять строки на основе существенных и стабильных свойств строки. Например, если у вас есть
id
переменная столбца, которая однозначно идентифицирует каждый случай, вы можете использовать это.В других случаях у вас будут формальные критерии исключения, которые можно указать, и вы можете использовать один из многих инструментов поднабора в R для исключения случаев, основанных на этом правиле.
источник
Создайте столбец id в вашем фрейме данных или используйте любое имя столбца для идентификации строки. Использование индекса несправедливо для удаления.
Используйте
subset
функцию для создания нового кадра.источник
По упрощенной последовательности:
По последовательности:
По негативной последовательности:
Или, если вы хотите поднабор, выбрав нечетные числа:
Или, если вы хотите установить подмножество, выбрав нечетные числа, версия 2:
Или, если вы хотите установить подмножество, отфильтровывая четные числа:
Или, если вы хотите установить подмножество, отфильтровывая четные числа, версия 2:
источник
Удалить Dan из employee.data - Нет необходимости управлять новым data.frame.
источник
Вот быстрая и грязная функция для удаления строки по индексу.
Его главный недостаток в том, что аргумент row_index не следует шаблону R, являющемуся вектором значений. Могут быть и другие проблемы, поскольку я потратил всего пару минут на написание и тестирование и начал использовать R только в последние несколько недель. Любые комментарии и улучшения по этому поводу будут очень приветствоваться!
источник
Для полноты добавлю, что это можно сделать и с
dplyr
помощьюslice
. Преимущество использования этого в том, что он может быть частью конвейерного рабочего процесса.Конечно, вы также можете использовать его без труб.
Формат «не вектор»
-c(2, 4, 6)
означает получение всего, что не находится в строках 2, 4 и 6. Например, для диапазона, например, вы хотите удалить первые 5 строкslice(df, 6:n())
. Дополнительные примеры см. В документации .источник