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 vonlistEs 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?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage