Rimuovi un’intera colonna da un data.frame in R

Qualcuno sa come rimuovere un’intera colonna da un data.frame in R? Per esempio se mi viene dato questo data.frame:

> head(data) chr genome region 1 chr1 hg19_refGene CDS 2 chr1 hg19_refGene exon 3 chr1 hg19_refGene CDS 4 chr1 hg19_refGene exon 5 chr1 hg19_refGene CDS 6 chr1 hg19_refGene exon 

e voglio rimuovere la 2a colonna.

Puoi impostarlo su NULL .

 > Data$genome <- NULL > head(Data) chr region 1 chr1 CDS 2 chr1 exon 3 chr1 CDS 4 chr1 exon 5 chr1 CDS 6 chr1 exon 

Come sottolineato nei commenti, ecco alcune altre possibilità:

 Data[2] <- NULL # Wojciech Sobala Data[[2]] <- NULL # same as above Data <- Data[,-2] # Ian Fellows Data <- Data[-2] # same as above 

Puoi rimuovere più colonne tramite:

 Data[1:2] <- list(NULL) # Marek Data[1:2] <- NULL # does not work! 

Fai attenzione però alla subsetting delle matrici, dato che puoi finire con un vettore:

 Data <- Data[,-(2:3)] # vector Data <- Data[,-(2:3),drop=FALSE] # still a data.frame 

Per rimuovere una o più colonne per nome, quando i nomi delle colonne sono noti (al contrario di essere determinati in fase di esecuzione), mi piace la syntax subset() . Ad esempio per il data-frame

 df <- data.frame(a=1:3, d=2:4, c=3:5, b=4:6) 

per rimuovere solo a colonna che potresti fare

 Data <- subset( Data, select = -a ) 

e per rimuovere le colonne b e d che potreste fare

 Data <- subset( Data, select = -c(d, b ) ) 

Puoi rimuovere tutte le colonne tra d e b con:

 Data <- subset( Data, select = -c( d : b ) 

Come ho detto sopra, questa syntax funziona solo quando i nomi delle colonne sono noti. Non funzionerà quando si dice che i nomi delle colonne sono determinati a livello di programmazione (cioè assegnati a una variabile). Riprodurrò questo avviso dalla documentazione del ?subset :

Avvertimento:

Questa è una funzione di convenienza pensata per l'uso interattivo. Per la programmazione è meglio usare le funzioni di subsetting standard come '[', e in particolare la valutazione non standard dell'argomento 'sottoinsieme' può avere conseguenze impreviste.

Le risposte postate sono molto buone quando si lavora con data.frame s. Tuttavia, questi compiti possono essere piuttosto inefficienti dal punto di vista della memoria. Con i dati di grandi dimensioni, la rimozione di una colonna può richiedere un tempo insolitamente lungo e / o non riuscire a causa out of memory errori out of memory insufficienti. Il pacchetto data.table aiuta a risolvere questo problema con l’operatore: := :

 library(data.table) > dt <- data.table(a = 1, b = 1, c = 1) > dt[,a:=NULL] bc [1,] 1 1 

Dovrei mettere insieme un esempio più grande per mostrare le differenze. Aggiornerò questa risposta ad un certo punto con quello.

(Per completezza) Se vuoi rimuovere le colonne per nome, puoi farlo:

 cols.dont.want <- "genome" cols.dont.want <- c("genome", "region") # if you want to remove multiple columns data <- data[, ! names(data) %in% cols.dont.want, drop = F] 

Includendo drop = F garantisce che il risultato sarà ancora un data.frame anche se rimane una sola colonna.

Con questo è ansible rimuovere la column e memorizzare la variable in un’altra variable .

 df = subset(data, select = -c(genome) )