Eliminar una columna completa de un data.frame en R

¿Alguien sabe cómo eliminar una columna completa de un data.frame en R? Por ejemplo, si me dan este 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 

y quiero eliminar la segunda columna.

Puede establecerlo en 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 

Como se señala en los comentarios, estas son algunas otras posibilidades:

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

Puede eliminar múltiples columnas a través de:

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

Tenga cuidado con el subconjunto de matrices, ya que puede terminar con un vector:

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

Para eliminar una o más columnas por nombre, cuando se conocen los nombres de las columnas (en lugar de determinarlas en tiempo de ejecución), me gusta la syntax del subset() . Por ejemplo, para el dataframe

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

para eliminar solo la columna a que podrías hacer

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

y para eliminar las columnas b y d que podrías hacer

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

Puede eliminar todas las columnas entre d con:

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

Como dije antes, esta syntax solo funciona cuando se conocen los nombres de las columnas. No funcionará cuando digamos que los nombres de las columnas se determinan programáticamente (es decir, asignados a una variable). Reproduciré esta Advertencia de la documentación del ?subset :

Advertencia:

Esta es una función de conveniencia diseñada para su uso de manera interactiva. Para la progtwigción, es mejor utilizar las funciones de subconjunto estándar como '[', y en particular la evaluación no estándar del argumento 'subconjunto' puede tener consecuencias imprevistas.

Las respuestas publicadas son muy buenas cuando se trabaja con data.frame s. Sin embargo, estas tareas pueden ser bastante ineficientes desde la perspectiva de la memoria. Con datos de gran tamaño, la eliminación de una columna puede tomar una cantidad de tiempo inusualmente larga y / o fallar debido a errores de falta out of memory . Package data.table ayuda a resolver este problema con el operador: :=

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

Debería armar un ejemplo más grande para mostrar las diferencias. Actualizaré esta respuesta en algún momento con eso.

(Para completar) Si desea eliminar columnas por su nombre, puede hacer esto:

 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] 

Incluir drop = F asegura que el resultado seguirá siendo un data.frame incluso si solo queda una columna.

Con esto puedes eliminar la column y almacenar la variable en otra variable .

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