Verhalten von <- NULL in Listen im Vergleich zu data.frames zum Entfernen von Daten
Viele R-Benutzer finden schließlich viele Möglichkeiten, Elemente aus ihren Daten zu entfernen. Ein Weg ist zu benutzenNULL
, insbesondere, wenn Sie eine Spalte aus einerdata.frame
oder löschen Sie ein Element von alist
.
Irgendwann stößt ein Benutzer auf eine Situation, in der er mehrere Spalten aus einem löschen möchtedata.frame
sofort, und sie stießen auf<- list(NULL)
als Lösung (seit der Verwendung von<- NULL
wird zu einem Fehler führen).
A data.frame
ist eine besondere Art vonlist
Es wäre also nicht allzu schwierig, sich vorzustellen, dass die Methoden zum Entfernen von Elementen aus alist
sollte das gleiche sein wie das Entfernen von Spalten aus adata.frame
. Sie führen jedoch zu unterschiedlichen Ergebnissen, wie im folgenden Beispiel zu sehen ist.
## 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
Wechseln Sie zur Anwendung des gleichen Konzepts auf alist
, und vergleichen Sie den Unterschied im Verhalten.
## 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
Die Hauptfragen, die ich habe, sind, wenn adata.frame
ist einlist
, warum verhält es sich in diesem Szenario so anders? Gibt es eine narrensichere Methode, um zu wissen, wann ein Element gelöscht wird, wann es einen Fehler erzeugt und wann es einfach mit a gekennzeichnet wird?NULL
Wert? Oder sind wir dafür auf Trial-and-Error angewiesen?