2016-08-01 36 views
1
dt = data.table(x = c(1,1,2,2,2,2,3,3,3,3)) 
dt[, y := if(.N > 2) .N else NA, by = x] # fail 
dt[, y := if(.N > 2) .N else NA_integer_, by = x] # good 

Diese erste Gruppierung schlägt fehl, weil NA einen Typ hat und nicht ganzzahlig ist. Gibt es eine Möglichkeit, die Datentabelle anzuweisen, dies zu ignorieren und alle NAs zu einem Typ zu machen, der die Konsistenz beibehält?R data.table NA type consistency

Ich kann NA_integer hier manuell einstellen, aber wenn ich viele Spalten verschiedener Typen habe, ist es schwierig, alle NA-Typen korrekt einzustellen.

BTW, welchen NA-Typ sollte ich für Date/IDate/ITime verwenden?

+0

@RichardScriven Ich bin mir sicher, zweitens funktioniert. Verwenden Sie RStudio? Manchmal wiederholt RStuidio die vorherige Fehlermeldung, wenn neue Befehle erfolgreich ausgeführt wurden. – jf328

+0

@RichardScriven oh, ich verstehe warum. Führen Sie die beiden nicht nacheinander aus. Der fehlgeschlagene Befehl ändert die Tabelle tatsächlich. – jf328

+0

Ihre "x" -Spalte ist keine "ganze Zahl" - ich denke, die "ganze Zahl" wird wegen '.N' benötigt, so dass Sie' .N' als zurückgegebenen Wert verwenden könnten Hardcode 'NA_integer_' für verschiedene' Typ's. In anderen Fällen setzen Sie den 'storage.mode' des zurückgegebenen Wertes (hier' NA') auf den entsprechenden Typ. –

Antwort

3

erste Frage des OP: Gibt es eine Möglichkeit Datentabelle zu sagen, dass zu ignorieren und versuchen, alle NAs zu welcher Art auch immer, die Konsistenz hält zu machen?

Nein, Sie werden einen ähnlichen Fehler, ohne die Zuordnung siehe:

dt[, if(.N > 2) .N else NA, by = x] 
# Error in `[.data.table`(dt, , if (.N > 2) .N else NA, by = x) : 
# Column 1 of result for group 2 is type 'integer' but expecting type 'logical'. Column types must be consistent for each group. 

Meiner Meinung nach ist diese „Spaltentypen für jede Gruppe konsistent sein muss.“ Die Nachricht sollte auch für Ihren Fall angezeigt werden.


zweite Frage des OP: BTW, was NA Typ sollte ich für Datum/IDATE/ITime verwenden?

Für iDate et al, I durch NA_integer_, immer Teilmenge, die eine Länge einer NA-Scheibe zu geben scheint, z.B. as.IDate(Sys.Date())[NA_integer_]. Ich weiß nicht, ob das tun sollte, aber ich kenne keine bessere Idee. Eine Illustration:

z = IDateTime(factor(Sys.time())) 
#   idate itime 
# 1: 2016-08-01 16:05:25 

str(lapply(z, function(x) x[NA_integer_])) 
# List of 2 
# $ idate: IDate[1:1], format: NA 
# $ itime:Class 'ITime' int NA 
+0

Die Teilmenge Methode funktioniert nicht für ITime - funktioniert für IDate – jf328

+0

@ jf328 Ich habe in einem Beispiel, wie ich es benutze und den Sinn, in dem ich denke, dass es "funktioniert" bearbeitet. Könnten Sie genauer sein? Für mich reicht es aus, dass das Klassenattribut erhalten bleibt. – Frank

+0

'as.ITime (" 00:00:01 ") [NA_integer_]' bekommt einen Fehler - data.table Problem, denke ich? – jf328