Para deshacerme de una columna llamada "foo" en un data.frame
, puedo hacer:
df <- df[-grep('foo', colnames(df))]
Sin embargo, una vez df
se convierte en undata.table
objeto, 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 data.table
objeto, esto ya no funciona.
r
data.table
Maiasaura
fuente
fuente
dt
lugar dedf3
...Respuestas:
Cualquiera de los siguientes eliminará la columna
foo
de data.tabledf3
:data.table también admite la siguiente sintaxis:
aunque si en realidad estaban esperando para extraer la columna
"foo"
dedf3
(en lugar de sólo la impresión de una vista dedf3
la columna menos"foo"
) que realmente te quiere utilizar el método 1 en su lugar.(Tenga en cuenta que si utiliza un método que se basa en
grep()
ogrepl()
, debe establecerlo enpattern="^foo$"
lugar de hacerlo"foo"
, si no desea que las columnas con nombres como"fool"
y"buffoon"
(es decir, las que contienenfoo
como una subcadena) también coincidan y se eliminen).Opciones menos seguras, bien para uso interactivo:
Los siguientes dos modismos también funcionarán, si
df3
contiene una coincidencia de columna"foo"
, pero fallarán de una manera probablemente inesperada si no lo hace. Si, por ejemplo, usa alguno de ellos para buscar la columna inexistente"bar"
, 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 cualquier columna con nombres que contengan la subcadena
"foo"
. Para fines de programación (o si realmente desea eliminar la (s) columna (s) endf3
lugar de una copia de ella), los Métodos 1, 2a y 2b son realmente las mejores opciones.Por último, hay enfoques que usan
with=FALSE
, aunquedata.table
gradualmente se aleja del uso de este argumento, por lo que ahora se desaconseja dónde puede evitarlo; que se muestra aquí para que sepa que la opción existe en caso de que realmente la necesite:fuente
-grep
versus!grepl
.grepl()
inicialmente y no funcionó, ya que las columnas data.table no pueden ser indexadas por un vector lógico. Pero ahora me doy cuenta de quegrepl()
se puede hacer que funcione envolviéndolowhich()
, para que devuelva un vector entero.data.table
, ¡pero envolverlowhich
es inteligente!data.table
; añadido FR # 1797 . Pero, el método 1 es (casi) infinitamente más rápido que los demás. El método 1 elimina la columna por referencia sin ninguna copia. Dudo que lo consigas por encima de 0.005 segundos para cualquier tabla de datos de tamaño. Por el contrario, los otros podrían no funcionar si la tabla está cerca del 50% de RAM porque copian todos menos el que se va a eliminar.También puede usar
set
para esto, que evita la sobrecarga de los[.data.table
bucles:Si desea hacerlo por nombre de columna,
which(colnames(dt) %in% c("a","c","e"))
debería funcionar paraj
.fuente
data.table
1.11.8, si desea hacerlo por nombre de columna, puede hacerlo directamenterm.col = c("a","b")
ydt[, (rm.col):=NULL]
Simplemente lo hago en el tipo de marco de datos:
Funciona rápido y, por lo que pude ver, no causa ningún problema.
ACTUALIZACIÓN: no es el mejor método si su DT es muy grande, ya que el uso del
$<-
operador conducirá a la copia de objetos. Así que mejor uso:fuente
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 columna #careadviced
Esto eliminará columnas basadas en el número de columna en su lugar.
Obviamente no es tan eficiente porque evita las ventajas de data.table, pero si está trabajando con menos de 500,000 filas, funciona bien
fuente
Suponga que su DT tiene columnas
col1
,col2
,col3
,col4
,col5
,coln
.Para eliminar un subconjunto de ellos:
fuente
Aquí hay una forma en que desea establecer un número de columnas en NULL, dado que sus nombres de columnas son una función para su uso :)
fuente
fuente
Para un data.table, la asignación de la columna a NULL lo elimina:
... que es el equivalente de:
El equivalente para un data.frame es:
P. ¿Por qué hay una coma en la versión para data.table y ninguna coma en la versión para data.frame?
A. Como data.frames se almacenan como una lista de columnas, puede omitir la coma. También puede agregarlo, sin embargo, deberá asignarlos a una lista de
NULL
sDF[, c("col1", "col2", "col3")] <- list(NULL)
,.fuente
data.frames
en la que se cambiarían la fila y las columnas. Eso sería ilógico.DF[column,row]
así que solo quería ver si realmente hubo casos en los que esto sucedió.