Entfernen Sie mehrere Spalten aus data.table

75

Was ist der richtige Weg, um mehrere Spalten aus einer data.table zu entfernen? Ich verwende derzeit den folgenden Code, habe jedoch ein unerwartetes Verhalten festgestellt, als ich versehentlich einen der Spaltennamen wiederholt habe. Ich war mir nicht sicher, ob dies ein Fehler war oder ob ich Spalten nicht auf diese Weise entfernen sollte.

library(data.table)
DT <- data.table(x = letters, y = letters, z = letters)
DT[ ,c("x","y") := NULL]
names(DT)
[1] "z"

Das obige funktioniert gut, aber

DT <- data.table(x = letters, y = letters, z = letters)
DT[ ,c("x","x") := NULL]
names(DT)
[1] "z"
matt_k
quelle
3
+1. Interessanter Fund. Wenn Sie zwei "y" löschen, bleibt "x" übrig. Und wenn Sie zwei "z" löschen, stürzt es ab!
Frank
4
Im Moment könnten Sie die LHS der :=Aufgabe in einen Aufruf einschließen unique()(dh verwenden DT[ ,unique(c("x","x")) := NULL]), um besonders defensiv zu sein. Da dies wie ein data.table- Fehler erscheint, müssen Sie das wohl nur tun, bis Matthew Dowle diesen Anruf unique()innerhalb des[.data.table()
Josh O'Brien
Gute Idee über einzigartig. Vielen Dank.
matt_k
1
Hallo Leute, vielleicht weißt du warum dieser [R] Code bei mir nicht funktioniert? > myCols <- c ("Col1", "Col2") > DT [, myCols: = NULL] Angenommen, DT enthält beide Spalten
MindaugasK
3
@MindaugasK Ich habe eine Lösung dafür gefunden - Sie müssen Ihre Spaltenliste immer noch als Liste umschließen, damit sie funktioniert. Ändern Sie es in DT[, c(myCols):=NULL]und das sollte den Trick tun. Siehe rdatatable.gitlab.io/data.table/articles/…
Vince

Antworten:

36

Dies sieht aus wie ein solider, reproduzierbarer Fehler. Es wurde als Bug # 2791 abgelegt .

Es scheint, dass beim Wiederholen der Spalte versucht wird, die nachfolgenden Spalten zu löschen.
Wenn keine Spalten mehr vorhanden sind, stürzt R ab.


UPDATE : Jetzt in Version 1.8.11 behoben. Aus NEWS :

Das zweimalige Zuweisen zu derselben Spalte in derselben Abfrage ist jetzt unter bestimmten Umständen eher ein Fehler als ein Absturz. zB DT [, c ("B", "B"): = NULL] (zweimal durch Bezugnahme auf dieselbe Spalte löschen). Vielen Dank an Ricardo ( # 2751 ) und matt_k ( # 2791 ) für die Berichterstattung. Tests hinzugefügt.

Ricardo Saporta
quelle
Ich möchte hinzufügen, dass die Punktsyntax (die in einigen DT-Operationen als Verknüpfung für die Liste verwendet wird) hier nicht funktioniert, dh DT[ , .("x","x") := NULL]fehlschlägt. Es scheint, als müsste es sich um einen Vektor der Namen der Spalten als Zeichenfolgen handeln.
Bar
18

Dieses Q wurde beantwortet, aber betrachten Sie dies als Randnotiz.

Ich bevorzuge die folgende Syntax, um mehrere Spalten zu löschen

DT[ ,`:=`(x = NULL, y = NULL)]

weil es mit dem übereinstimmt, um mehrere Spalten (Variablen) hinzuzufügen

DT[ ,`:=`(x = letters, y = "Male")]

Dadurch wird auch nach doppelten Spaltennamen gesucht. Wenn Sie also versuchen, xzweimal zu fallen, wird eine Fehlermeldung ausgegeben.

Pankil Shah
quelle