Comportamiento de <- NULL en listas frente a datos. Marcos para eliminar datos
Muchos usuarios de R finalmente descubren muchas formas de eliminar elementos de sus datos. Una forma es usarNULL
, particularmente cuando quieres hacer algo como eliminar una columna de undata.frame
o soltar un elemento de unlist
.
Finalmente, un usuario se encuentra con una situación en la que desea eliminar varias columnas de undata.frame
a la vez, y golpearon<- list(NULL)
como la solución (ya que usando<- NULL
dará lugar a un error).
A data.frame
es un tipo especial delist
, por lo que no sería demasiado difícil imaginar que los enfoques para eliminar elementos de unlist
debería ser lo mismo que eliminar columnas de unadata.frame
. Sin embargo, producen resultados diferentes, como se puede ver en el siguiente ejemplo.
## Make some small data--two data.frames and two lists
cars1 <- cars2 <- head(mtcars)[1:4]
cars3 <- cars4 <- as.list(cars2)
## Demonstration that the `list(NULL)` approach works
cars1[c("mpg", "cyl")] <- list(NULL)
cars1
# disp hp
# Mazda RX4 160 110
# Mazda RX4 Wag 160 110
# Datsun 710 108 93
# Hornet 4 Drive 258 110
# Hornet Sportabout 360 175
# Valiant 225 105
## Demonstration that simply using `NULL` does not work
cars2[c("mpg", "cyl")] <- NULL
# Error in `[<-.data.frame`(`*tmp*`, c("mpg", "cyl"), value = NULL) :
# replacement has 0 items, need 12
Cambiar a aplicar el mismo concepto a unlist
, y comparar la diferencia de comportamiento.
## Does not fully drop the items, but sets them to `NULL`
cars3[c("mpg", "cyl")] <- list(NULL)
# $mpg
# NULL
#
# $cyl
# NULL
#
# $disp
# [1] 160 160 108 258 360 225
#
# $hp
# [1] 110 110 93 110 175 105
## *Does* drop the `list` items while this would
## have produced an error with a `data.frame`
cars4[c("mpg", "cyl")] <- NULL
# $disp
# [1] 160 160 108 258 360 225
#
# $hp
# [1] 110 110 93 110 175 105
Las principales preguntas que tengo son, si undata.frame
es unlist
, ¿por qué se comporta de manera tan diferente en este escenario? ¿Existe una manera infalible de saber cuándo se eliminará un elemento, cuándo producirá un error y cuándo simplemente se le dará unaNULL
¿valor? ¿O dependemos de la prueba y error para esto?