Data.table: Sollte rbindlist(..., fill=TRUE) NA_logical_ in Listenspalten zurückgeben?

Erstellt am 25. Jan. 2020  ·  6Kommentare  ·  Quelle: Rdatatable/data.table

Von #4196:

Beim Füllen einer Listenspalte weicht rbindlist vom Verhalten aller anderen Spaltentypen ab und gibt NULL-Elemente anstelle von NA zurück:

> A = data.table(c1=0, c2=list(1:3))
> B = data.table(c1=1)
> rbind(A,B,fill=TRUE)
      c1     c2
   <num> <list>
1:     0  1,2,3
2:     1   

Erwartet:

> A = data.table(c1=0, c2=list(1:3))
> B = data.table(c1=1)
> rbind(A,B,fill=TRUE)
      c1     c2
   <num> <list>
1:     0  1,2,3
2:     1  NA   

Sollten wir dieses Verhalten für Listenspalten ändern, um die Zeilen mit NA-Werten zu füllen, damit sie dem Verhalten von fill=TRUE für andere Spaltentypen entsprechen?

non-atomic column question

Hilfreichster Kommentar

Was wäre, wenn wir stattdessen einfach einen Satz zur Dokumentation hinzufügen, der das Verhalten im Falle einer fehlenden Listenspalte festhält:

Aktueller Eintrag für das Fill-Argument:

TRUE füllt fehlende Spalten mit NAs. Standardmäßig FALSCH. Bei TRUE wird use.names auf TRUE gesetzt.

Vorgeschlagen:

TRUE füllt fehlende Spalten mit NAs oder NULL für fehlende Listenspalten. Standardmäßig FALSCH. Bei TRUE wird use.names auf TRUE gesetzt.

Alle 6 Kommentare

PR mit Fix zur Verfügung gestellt, wenn wir die Änderung vornehmen möchten

Das aktuelle Verhalten scheint mir in Ordnung zu sein.

> str(as.integer(NULL)[1L])
 int NA
> str(as.list(NULL)[1L])
List of 1
 $ : NULL

IMO sollte es nicht NA sein, weil:

  • es ändert den Typ von einem fehlenden Feld (undefiniert) in einen logischen Vektor
  • es ändert die Länge von 0 Länge auf Länge 1

Ich tendiere zu Jans Standpunkt. Das aktuelle Verhalten eines leeren Elements ist eigentlich die Art einer Liste, das Fehlen darzustellen (es gibt kein Objekt, auf das man zeigen kann). Wir könnten ein Beispiel konstruieren, bei dem jedes Element der Liste ein logischer Vektor ist, wobei jedes Element das Ergebnis einer Berechnung ist. In einem solchen Fall müssen möglicherweise 3 verschiedene Zustände dargestellt werden: Länge 0 logisch, Länge 1 NA logisch und fehlende Berechnung. Wenn Länge 1 NA logisch für das Fehlen verwendet wurde, konnten diese 2 nicht unterschieden werden.

Würde es ausreichen, die Druckmethode zu ändern? Anstatt dass nichts gedruckt wird, wie wäre es mit NULL ? Das Drucken von NA könnte wiederum eine Länge von 1 NA logisch implizieren, während NULL eindeutig wäre, konsistent mit dem, was Basis-R für leere Listenelemente druckt, und würde eine weitere visuelle Erinnerung daran geben, dass es sich um eine Liste handelte Säule.

stimmen auch w Jan überein, insbesondere über Länge 0 --> Länge 1.

Ich verwende häufig lengths(x)>0, um Zeilen nach leeren Listenspalten zu filtern.

Ich könnte mir vorstellen, stattdessen dort logic() zu setzen, gibt es aber einen Vorteil von logic() gegenüber NULL?

Was wäre, wenn wir stattdessen einfach einen Satz zur Dokumentation hinzufügen, der das Verhalten im Falle einer fehlenden Listenspalte festhält:

Aktueller Eintrag für das Fill-Argument:

TRUE füllt fehlende Spalten mit NAs. Standardmäßig FALSCH. Bei TRUE wird use.names auf TRUE gesetzt.

Vorgeschlagen:

TRUE füllt fehlende Spalten mit NAs oder NULL für fehlende Listenspalten. Standardmäßig FALSCH. Bei TRUE wird use.names auf TRUE gesetzt.

Doc-Wechsel sieht gut aus. Plus die Änderung der Druckmethode, die ich auch vorgeschlagen habe?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen