Отмена выбора столбца по имени, R

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

Ответы

Ответ 1

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

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"))]
    

Ответ 2

Можно использовать функцию 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

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

subset(airquality, Day == 1, select = -Temp)

Ответ 4

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

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

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

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