2012-03-21 3 views
15

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

ответ

37

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

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 

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

  • несколько сокращенный вариант (любезно предоставлено @ Томас):

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

    dd[ ,!(colnames(dd) %in% c("A", "B"))] 
    
7

Можно использовать функцию 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). Поэтому было бы неплохо проверить наличие столбца с именем «А».

if(any(names(dd) == "A")) { 
    dd[, which(names(dd) != "A")] 
} 
5

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

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

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

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

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

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

Смежные вопросы