2013-05-19 14 views
57

Was ist der richtige Weg, um mehrere Spalten aus einer data.table zu entfernen? Ich verwende derzeit den folgenden Code, erhalte jedoch unerwartetes Verhalten, als ich versehentlich einen der Spaltennamen wiederholte. Ich war mir nicht sicher, ob das ein Fehler war oder ob ich die Spalten nicht entfernen sollte.Entfernen Sie mehrere Spalten aus data.table

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

Die oben genannten Arbeiten in Ordnung, aber

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

+1. Interessanter Fund Wenn Sie zwei "y" löschen, erhalten Sie "x" übrig. Und wenn Sie zwei "z" löschen, stürzt es ab! – Frank

+4

Jetzt können Sie die LHS der ': =' Zuweisung in einen Aufruf von 'unique()' (dh verwenden Sie DT [, unique (c ("x", "x")): = NULL] ') extra defensiv sein. Da dies wie ein ** data.table ** -Bug aussieht, würde ich annehmen, dass Sie das nur tun müssen, bis Matthew Dowle diesen Aufruf an 'unique()' (oder etwas Gleichwertiges) innerhalb der '[ .data.table() ' –

+0

Gute Idee über einzigartig. Vielen Dank. –

Antwort

32

Das sieht aus wie ein solider, reproduzierbaren Fehler. Es wurde als Bug #2791 eingereicht.

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


UPDATE: Jetzt in v1.8.11 fixiert. Von :

Zuweisen derselben Spalte zweimal in derselben Abfrage ist nun unter bestimmten Umständen ein Fehler und nicht ein Absturz; z. B. DT [, c ("B", "B"): = NULL] (zweimal durch Bezugnahme auf dieselbe Spalte löschen). Danke an Ricardo (#2751) und matt_k (#2791) für das Reporting. Tests hinzugefügt.

+0

Ich möchte hinzufügen, dass die Punktsyntax (die als Abkürzung für eine Liste in einigen DT-Operationen verwendet wird) hier nicht funktioniert, dh 'DT [,. (" X "," x "): = NULL]' wird versagen. Es scheint, dass es ein Vektor der Namen der Spalten als Strings sein muss. – Bar

11

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

Ich ziehe die folgende Syntax mehrere Spalten

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

, weil es übereinstimmt, die fallen zu lassen, um mehrere Spalten (Variablen) hinzufügen

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

Dies gilt auch für die duplizierten Spaltennamen überprüfen. Wenn Sie versuchen, x zweimal zu löschen, wird eine Fehlermeldung ausgegeben.

Verwandte Themen