Как удалить строки во фрейме данных?

171

У меня есть кадр данных с именем "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 
  • 9
    Кроме того, вы можете ознакомиться с некоторой общей терминологией для работы с данными. Обычно это называется подмножеством, которое, если вы будете искать в Google «r подмножество данных», вы попадете на очень полезную страницу UCLA R FAQ . Кстати, добро пожаловать в Stackoverflow!
  • 0
    Добавлены некоторые дополнительные способы поднабора с использованием логических векторов, в дополнение к превосходному ответу @ mrdwab.
Показать ещё 1 комментарий
Теги:
row

6 ответов

260

Основная идея заключается в том, что вы формируете набор строк, которые хотите удалить, и сохраняйте дополнение к этому набору.

В R дополнение к множеству задается оператором '-'.

Итак, если data.frame называется myData:

myData[-c(2, 4, 6), ]   # notice the -

Конечно, не забудьте "переназначить" myData, если вы хотите полностью удалить эти строки. В противном случае R просто распечатывает результаты.

myData <- myData[-c(2, 4, 6), ]
  • 52
    Не забудьте отметить , там! ;)
  • 2
    Что делать, если ваш фрейм данных только один столбец. Кажется, чтобы отбросить всю структуру и выводит вектор значений
Показать ещё 5 комментариев
62

Вы также можете работать с так называемым логическим вектором, aka logical:

row_to_keep = c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE)
myData = myData[row_to_keep,]

Обратите внимание, что оператор ! действует как NOT, т.е. !TRUE == FALSE:

myData = myData[!row_to_keep,]

Это кажется немного громоздким по сравнению с ответом @mrwab (+1 btw:)), но логический вектор может быть сгенерирован "на лету", например. где значение столбца превышает определенное значение:

myData = myData[myData$A > 4,]
myData = myData[!myData$A > 4,] # equal to myData[myData$A <= 4,]

Вы можете преобразовать булевой вектор в вектор индексов:

row_to_keep = which(myData$A > 4)

Наконец, очень аккуратный трюк заключается в том, что вы можете использовать этот тип подмножества не только для извлечения, но и для назначения:

myData$A[myData$A > 4,] <- NA

где столбцу A присваивается NA (а не число), где A превышает 4.

  • 0
    Что если вы хотите исключить их? В вашем примере № 3, если вы уменьшите
41

Проблемы с удалением по номеру строки

Для быстрого и грязного анализа вы можете удалить строки data.frame по номерам согласно верхнему ответу. То есть,

newdata <- myData[-c(2, 4, 6), ] 

Однако, если вы пытаетесь написать надежный сценарий анализа данных, вам, как правило, следует избегать удаления строк по числовой позиции. Это связано с тем, что в будущем порядок строк в ваших данных может измениться. Общий принцип таблиц data.frame или базы данных заключается в том, что порядок строк не должен иметь значения. Если порядок имеет значение, это должно быть закодировано в фактической переменной в data.frame.

Например, представьте, что вы импортировали набор данных и удалили строки по числовой позиции после проверки данных и определения номеров строк, которые вы хотите удалить. Однако в более поздний момент вы переходите к необработанным данным, осматриваетесь и переупорядочиваете данные. Ваш код удаления строк теперь будет удалять неправильные строки, и, что еще хуже, вы вряд ли получите какие-либо ошибки, предупреждающие вас о том, что это произошло.

Лучшая стратегия

Лучшая стратегия состоит в том, чтобы удалять строки на основе существенных и стабильных свойств строки. Например, если у вас есть переменная столбца id которая уникально идентифицирует каждый случай, вы можете использовать это.

newdata <- myData[ !(myData$id %in% c(2,4,6)), ]

В других случаях у вас будут формальные критерии исключения, которые можно указать, и вы можете использовать один из многих инструментов поднабора в R, чтобы исключить случаи, основанные на этом правиле.

  • 0
    Это работает безупречно! Спасибо!
9

Создайте столбец id в вашем фрейме данных или используйте любое имя столбца для идентификации строки. Использование индекса несправедливо для удаления.

Используйте subset функцию для создания нового фрейма.

updated_myData <- subset(myData, id!= 6)
print (updated_myData)

updated_myData <- subset(myData, id %in% c(1, 3, 5, 7))
print (updated_myData)
4

По упрощенной последовательности:

mydata[-(1:3 * 2), ]

По последовательности:

mydata[seq(1, nrow(mydata), by = 2) , ]

По негативной последовательности:

mydata[-seq(2, nrow(mydata), by = 2) , ]

Или, если вы хотите поднабор, выбрав нечетные числа:

mydata[which(1:nrow(mydata) %% 2 == 1) , ]

Или, если вы хотите установить подмножество, выбрав нечетные числа, версия 2:

mydata[which(1:nrow(mydata) %% 2 != 0) , ]

Или, если вы хотите установить подмножество, отфильтровывая четные числа:

mydata[!which(1:nrow(mydata) %% 2 == 0) , ]

Или, если вы хотите выполнить подмножество, отфильтровывая четные числа, версия 2:

mydata[!which(1:nrow(mydata) %% 2 != 1) , ]
0

Удалить Dan из employee.data - Нет необходимости управлять новым data.frame.

employee.data <- subset(employee.data, name!="Dan")

Ещё вопросы

Сообщество Overcoder
Наверх
Меню