2012-03-21 23 views
15

Esiste un modo per selezionare tutte le colonne di un frame di dati ad eccezione di una colonna con un nome particolare: sarebbe l'analogo di df[,-1], tranne che utilizzando il nome della colonna anziché l'indice?deselezione di una colonna per nome, R

risposta

37

Si può fare questo usando vettore sottoinsiemi. In primo luogo, creare un set di dati fittizi:

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

quindi utilizzare l'operatore ! per invertire la selezione:

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

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

In alternativa, si potrebbe avere:

  • Una versione leggermente più corta (per gentile concessione di @Tomas):

    dd[ , names(dd) != "A"] 
    
  • Per far fronte a più colonne (concessione @Tyler)

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

Si potrebbe utilizzare la funzione which() per identificare la colonna da eliminare.

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

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

o positivamente

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

Tuttavia, se non v'è alcuna colonna denominata "A", si otterrebbe un frame di dati con 0 colonne e nrow(dd) righe. Quindi sarebbe bene verificare l'esistenza di una colonna denominata "A".

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

La funzione subset consente già questo tipo di sintassi, dagli esempi sulla pagina di aiuto:

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

Per deselezionando più colonne è possibile utilizzare il pacchetto dplyr. Ad esempio:

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

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

questo è un altro modo oltre a quanto suggerito da @csgillespie.

Problemi correlati