У меня есть кадр данных с именем "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[-c(2, 4, 6), ] # notice the -
Конечно, не забудьте "переназначить" myData
, если вы хотите полностью удалить эти строки. В противном случае R просто распечатывает результаты.
myData <- myData[-c(2, 4, 6), ]
,
там! ;)
Вы также можете работать с так называемым логическим вектором, 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.
Для быстрого и грязного анализа вы можете удалить строки data.frame по номерам согласно верхнему ответу. То есть,
newdata <- myData[-c(2, 4, 6), ]
Однако, если вы пытаетесь написать надежный сценарий анализа данных, вам, как правило, следует избегать удаления строк по числовой позиции. Это связано с тем, что в будущем порядок строк в ваших данных может измениться. Общий принцип таблиц data.frame или базы данных заключается в том, что порядок строк не должен иметь значения. Если порядок имеет значение, это должно быть закодировано в фактической переменной в data.frame.
Например, представьте, что вы импортировали набор данных и удалили строки по числовой позиции после проверки данных и определения номеров строк, которые вы хотите удалить. Однако в более поздний момент вы переходите к необработанным данным, осматриваетесь и переупорядочиваете данные. Ваш код удаления строк теперь будет удалять неправильные строки, и, что еще хуже, вы вряд ли получите какие-либо ошибки, предупреждающие вас о том, что это произошло.
Лучшая стратегия состоит в том, чтобы удалять строки на основе существенных и стабильных свойств строки. Например, если у вас есть переменная столбца id
которая уникально идентифицирует каждый случай, вы можете использовать это.
newdata <- myData[ !(myData$id %in% c(2,4,6)), ]
В других случаях у вас будут формальные критерии исключения, которые можно указать, и вы можете использовать один из многих инструментов поднабора в R, чтобы исключить случаи, основанные на этом правиле.
Создайте столбец 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)
По упрощенной последовательности:
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) , ]
Удалить Dan из employee.data - Нет необходимости управлять новым data.frame.
employee.data <- subset(employee.data, name!="Dan")