web-dev-qa-db-fra.com

Désélectionner une colonne par son nom

Existe-t-il un moyen de sélectionner toutes les colonnes d'un cadre de données, à l'exception d'une colonne portant un nom particulier?.

Ce serait l'analogue de df[, -1], sauf en utilisant le nom de la colonne au lieu de l'index?

22
Alex

Vous pouvez le faire en utilisant un sous-ensemble vectoriel. Commencez par créer un jeu de données factice:

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

Puis utilisez l'opérateur ! pour inverser la sélection:

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

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

Alternativement, vous pourriez avoir:

  • Une version légèrement plus courte (avec la permission de @Tomas):

    dd[ , names(dd) != "A"]
    
  • Faire face à plusieurs colonnes (avec la permission de @Tyler)

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

On pourrait utiliser la fonction which() pour identifier la colonne à éliminer.

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

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

ou positivement

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

Cependant, s'il n'y a pas de colonne nommée "A", vous obtiendrez un cadre de données avec 0 colonnes et nrow(dd) lignes. Donc, il serait bon de vérifier l'existence d'une colonne nommée "A".

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

La fonction subset permet déjà ce type de syntaxe, à partir des exemples de la page d'aide:

subset(airquality, Day == 1, select = -Temp)
7
Greg Snow

Pour désélectionner plusieurs colonnes, vous pouvez utiliser le package dplyr. Par exemple:

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

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

c'est une autre manière que celle suggérée par @csgillespie.

3
mojimoji

supprimer A et C

base solution

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

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

data.table solution

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
1
Andre Elrico