Zachowanie <- NULL na listach a data.frames do usuwania danych
Wielu użytkowników R w końcu odkrywa wiele sposobów usunięcia elementów ze swoich danych. Jednym ze sposobów jest użycieNULL
, szczególnie gdy chcesz zrobić coś takiego, jak upuścić kolumnę z adata.frame
lub upuść element zlist
.
Ostatecznie użytkownik natrafia na sytuację, w której chce upuścić kilka kolumn zdata.frame
od razu, i uderzyli<- list(NULL)
jako rozwiązanie (od czasu użycia<- NULL
spowoduje błąd).
A data.frame
jest specjalny typlist
, więc trudno byłoby sobie wyobrazić, że metody usuwania elementów zlist
powinien być taki sam jak usuwanie kolumn zdata.frame
. Jednak dają one różne wyniki, jak widać w poniższym przykładzie.
## 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
Przełącz się na zastosowanie tej samej koncepcji dolist
i porównaj różnicę w zachowaniu.
## 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
Główne pytania, jakie mam, są następującedata.frame
jestlist
, dlaczego w tym scenariuszu zachowuje się tak inaczej? Czy istnieje niezawodny sposób poznania, kiedy element zostanie upuszczony, kiedy spowoduje błąd, a kiedy po prostu otrzymaNULL
wartość? A może zależy nam na próbie i błędzie?