2017-03-02 2 views
0

Ich verwende hauptsächlich Rstudio in Mac. Vor kurzem musste ich Windows benutzen. Ich habe jedoch herausgefunden, dass unique() keine eindeutigen Zeilen in der data.table basierend auf dem Schlüssel bereitstellt. Hier ein Beispiel:Unique verwendet keine Schlüssel mehr als Standard

a=c(2,3,3,3,3,5,6,7) 
b=c("a","a","f","g","a","d","t","l") 
e=data.table(a,b) 
setkey(e, a) 
key(e) # this works fine 
unique(e) 

unique() entfernt nur das Duplikat für die gesamte Zeile (Zeile 5). Der exakt gleiche Code läuft auf meinem Mac einwandfrei.

+3

Das liegt daran, dass Sie auf beiden Versionen unterschiedliche data.table-Versionen haben. Auf dem Mac haben Sie eine <1.9.8 Version, während Sie unter Windows eine neuere Version haben. Bitte, bitte, lesen Sie die Dokumentation von "Unique", z. "* Standardmäßig werden alle Spalten verwendet. Dies wurde kürzlich geändert, um Konsistenz zu data.frame-Methoden zu erreichen. In der Version <1.9.8 war der Standardwert key (x) *". Dann versuche 'unique (e, by =" a ")' auf deinem Windows. –

Antwort

3

Das liegt daran, dass Sie auf beiden Versionen unterschiedliche data.table-Versionen haben. Auf dem Mac gibt es eine Version 0.0.0.1.0.1.9.8 (die immer noch Schlüssel als Standard verwendet), während auf Windows Sie eine neuere Version haben (was nicht der Fall ist).

As (in data.table V1.9.8 +) in ?unique erklärte:

Standardmäßig werden alle Spalten verwendet werden. Dies wurde kürzlich für Konsistenz zu data.frame-Methoden geändert. In der Version 1.9.8 < Standard war Schlüssel (x)

Bedeutung, von jetzt an, müssen Sie explizit die by Variable angeben, auch wenn Sie bereits Schlüssel gesetzt haben, sonst ist es nur alle Spalten verwenden.

Für Ihr spezielles Beispiel, das funktioniert

unique(e, by = "a") 
# a b 
# 1: 2 a 
# 2: 3 a 
# 3: 5 d 
# 4: 6 t 
# 5: 7 l 

Oder wie @Frank in den Kommentaren erwähnt, können Sie auch den Schlüssel im by param angeben unique(a, by = key(a)) verwenden.

+2

Ja genau. Die Änderung sollte auch 'by = key()' explizit erforderlich machen, damit Leser des Codes später daran erinnert werden, dass dies geschieht. Zuvor mussten Sie wissen, und wenn ein Schlüssel stromaufwärts hinzugefügt wurde, würde dies das Verhalten von "unique" ändern. Sollte jetzt robuster sein. –

Verwandte Themen