r data.table

¿Cómo se borra una columna por nombre en data.table?



(8)

Para deshacerse de una columna llamada "foo" en un data.frame , puedo hacer:

df <- df[-grep(''foo'', colnames(df))]

Sin embargo, una vez que df se convierte en un objeto data.table , no hay forma de eliminar una columna.

Ejemplo:

df <- data.frame(id = 1:100, foo = rnorm(100)) df2 <- df[-grep(''foo'', colnames(df))] # works df3 <- data.table(df) df3[-grep(''foo'', colnames(df3))]

Pero una vez que se convierte en un objeto data.table , esto ya no funciona.


Cualquiera de los siguientes eliminará la columna foo de data.table df3 :

# Method 1 (and preferred as it takes 0.00s even on a 20GB data.table) df3[,foo:=NULL] df3[, c("foo","bar"):=NULL] # remove two columns myVar = "foo" df3[, (myVar):=NULL] # lookup myVar contents # Method 2a -- A safe idiom for excluding (possibly multiple) # columns matching a regex df3[, grep("^foo$", colnames(df3)):=NULL] # Method 2b -- An alternative to 2a, also "safe" in the sense described below df3[, which(grepl("^foo$", colnames(df3))):=NULL]

data.table también admite la siguiente sintaxis:

## Method 3 (could then assign to df3, df3[, !"foo", with=FALSE]

aunque si realmente desea eliminar la columna "foo" de df3 (en lugar de solo imprimir una vista de df3 menos la columna "foo" ), realmente desearía usar el Método 1 en su lugar.

(Tenga en cuenta que si utiliza un método que depende de grep() o grepl() , necesita establecer pattern="^foo$" lugar de "foo" , si no desea columnas con nombres como "fool" y "buffoon" (es decir, aquellos que contienen foo como una subcadena) para ser emparejado y eliminado).

Opciones menos seguras, bien para uso interactivo:

Los siguientes dos modismos también funcionarán si df3 contiene una columna que coincida con "foo" , pero fallarán de una manera probablemente inesperada si no lo hace. Si, por ejemplo, usa alguno de ellos para buscar la "bar" columna inexistente, terminará con una tabla de datos de fila cero.

Como consecuencia, son realmente más adecuados para el uso interactivo, donde uno podría, por ejemplo, querer mostrar una tabla de datos menos columnas con nombres que contengan la subcadena "foo" . Para propósitos de programación (o si realmente quiere eliminar la (s) columna (s) de df3 lugar de una copia), los Métodos 1, 2a y 2b son realmente las mejores opciones.

# Method 4a: df3[, -grep("^foo$", colnames(df3)), with=FALSE] # Method 4b: df3[, !grepl("^foo$", colnames(df3)), with=FALSE]


Esta es una forma en la que desea establecer un n. De columnas en NULL, dado el nombre de sus columnas, una función para su uso :)

deleteColsFromDataTable <- function (train, toDeleteColNames) {

for (myNm in toDeleteColNames) train <- train [,(myNm):=NULL,with=F] return (train)

}


Opción muy simple en caso de que tenga muchas columnas individuales para eliminar en una tabla de datos y desee evitar escribir todos los nombres de las columnas #careadviced

dt <- dt[, -c(1,4,6,17,83,104), with =F]

Esto eliminará las columnas en función del número de columna.

Obviamente no es tan eficiente porque evita las ventajas de data.table pero si trabajas con menos de 500,000 filas funciona bien


Para una tabla de datos, asignar la columna a NULL lo elimina:

DT[,c("col1", "col1", "col2", "col2")] <- NULL ^ |---- Notice the extra comma if DT is a data.table

... que es el equivalente de:

DT$col1 <- NULL DT$col2 <- NULL DT$col3 <- NULL DT$col4 <- NULL

El equivalente para un data.frame es:

DF[c("col1", "col1", "col2", "col2")] <- NULL ^ |---- Notice the missing comma if DF is a data.frame

P. ¿Por qué hay una coma en la versión de data.table y ninguna coma en la versión de data.frame?

R. Como data.frames se almacenan como una lista de columnas, puede omitir la coma. También podría agregarlo, sin embargo, deberá asignarlos a una lista de NULL s, DF[, c("col1", "col2", "col3")] <- list(NULL) .


Simplemente lo hago en el tipo de marco de datos:

DT$col = NULL

Funciona rápido y por lo que pude ver no causa ningún problema.

ACTUALIZAR: no es el mejor método si su DT es muy grande, ya que usar el operador $<- dará lugar a la copia de objetos. Mejor uso:

DT[, col:=NULL]


Suponga que su dt tiene columnas col1 , col2 , col4 , col5 , col4 , col5 .

Para eliminar un subconjunto de ellos:

vx <- as.character(bquote(c(col1, col2, col3, coln)))[-1] DT[, paste0(vx):=NULL]


También puede set usuario para esto, lo que evita la sobrecarga de [.data.table en bucles:

dt <- data.table( a=letters, b=LETTERS, c=seq(26), d=letters, e=letters ) set( dt, j=c(1L,3L,5L), value=NULL ) > dt[1:5] b d 1: A a 2: B b 3: C c 4: D d 5: E e

Si desea hacerlo por nombre de columna, which(colnames(dt) %in% c("a","c","e")) debería funcionar para j .


DT[,c:=NULL] # remove column c