Отмена выбора столбца по имени - PullRequest
26 голосов
/ 21 марта 2012

Есть ли способ выбрать все столбцы фрейма данных, кроме столбца с определенным именем.

Это будет аналог df[, -1], за исключением использования имени столбца вместо индекса?

Ответы [ 5 ]

51 голосов
/ 21 марта 2012

Вы можете сделать это с помощью поднабора векторов.Сначала создайте фиктивный набор данных:

R> dd = data.frame(A = 1:3, B = 1:3, C=1:3, D=1:3)

Затем используйте оператор !, чтобы отменить выбор:

R> dd[ ,!(colnames(dd) == "A")]

  B C D
1 1 1 1
2 2 2 2
3 3 3 3

В качестве альтернативы вы можете получить:

  • Немного более короткая версия (любезно предоставлено @Tomas):

    dd[ , names(dd) != "A"]
    
  • Для работы с несколькими столбцами (любезно предоставлено @Tyler)

    dd[ ,!(colnames(dd) %in% c("A", "B"))]
    
8 голосов
/ 21 марта 2012

Функция subset уже позволяет этот тип синтаксиса из примеров на странице справки:

subset(airquality, Day == 1, select = -Temp)
8 голосов
/ 21 марта 2012

Можно использовать функцию which() для определения столбца, который нужно удалить.

dd <- data.frame(A = 1:5, B = 1:5, C=1:5)

dd[, -which(names(dd) == "A")]

или положительно

dd[, which(names(dd) != "A")]

Однако, если нет столбца с именем «A», вы получите кадр данных с 0 столбцами и nrow(dd) строками. Поэтому было бы хорошо проверить наличие столбца с именем «A».

if(any(names(dd) == "A")) {
  dd[, which(names(dd) != "A")]
}
3 голосов
/ 21 мая 2017

Для отмены выбора нескольких столбцов вы можете использовать пакет dplyr. Как пример:

dd = data.frame(A = 1:3, B = 1:3, C=1:3, D=1:3)

library(dplyr)
newdd <- select(dd, -A,-C)

это еще один способ, кроме того, что предложил @csgillespie.

2 голосов
/ 03 мая 2018

удалить А и С

base раствор

df <- data.frame(A = 1:3, B = 1:3, C=1:3, D=1:3)

df[,c("A","C")]<-NULL

data.table раствор

dt <- data.table(A = 1:3, B = 1:3, C=1:3, D=1:3)

#    A B C D
# 1: 1 1 1 1
# 2: 2 2 2 2
# 3: 3 3 3 3

dt[,c("A","C"):=NULL]

#   B D
#1: 1 1
#2: 2 2
#3: 3 3
...