2015-05-21 10 views
5

Verwenden Sie data.table, sage ich den Schlüssel mit zwei Spalten, und eine der Spalten hat fehlende Werte. Datentabelle scheint die NA Werte zu den ersten Werten zu sortieren.Wie sortiert data.table NA-Werte in Schlüsselspalten?

require(data.table) 
set.seed(919) 

# Create sample data 
dt <- data.table(
    key1 = rep(1:10, each = 10), 
    key2 = rep_len(letters, 100) 
) 

# Set some key2 values to missing 
dt[sample(1:100, 10), "key2"] <- NA 

# Set key (sort) 
setkeyv(dt, c("key1", "key2")) 
dt 
# 1: 1 NA 
# 2: 1 a 
# 3: 1 b 
# 4: 1 c 
# 5: 1 d 
# 6: 1 f 
# 7: 1 g 
# 8: 1 h 
# 9: 1 i 
# 10: 1 j 
# 11: 2 NA 
# 12: 2 NA 
# 13: 2 k 
# 14: 2 m 
# 15: 2 n 
# 16: 2 o 
# 17: 2 p 
# 18: 2 q 
# 19: 2 r 
# 20: 2 s 
# 21: 3 a 
# 22: 3 b 
# 23: 3 c 
# 24: 3 d 
# 25: 3 u 
# 26: 3 v 
# 27: 3 w 
# 28: 3 x 
# 29: 3 y 
# 30: 3 z 
# 31: 4 e 
# 32: 4 f 
# 33: 4 g 
# 34: 4 h 
# 35: 4 i 
# 36: 4 j 
# 37: 4 k 
# 38: 4 l 
# 39: 4 m 
# 40: 4 n 
# 41: 5 NA 
# 42: 5 NA 
# 43: 5 o 
# 44: 5 q 
# 45: 5 r 
# 46: 5 s 
# 47: 5 u 
# 48: 5 v 
# 49: 5 w 
# 50: 5 x 
# 51: 6 NA 
# 52: 6 a 
# 53: 6 b 
# 54: 6 c 
# 55: 6 d 
# 56: 6 e 
# 57: 6 g 
# 58: 6 h 
# 59: 6 y 
# 60: 6 z 
# 61: 7 i 
# 62: 7 j 
# 63: 7 k 
# 64: 7 l 
# 65: 7 m 
# 66: 7 n 
# 67: 7 o 
# 68: 7 p 
# 69: 7 q 
# 70: 7 r 
# 71: 8 NA 
# 72: 8 NA 
# 73: 8 a 
# 74: 8 b 
# 75: 8 t 
# 76: 8 u 
# 77: 8 w 
# 78: 8 x 
# 79: 8 y 
# 80: 8 z 
# 81: 9 NA 
# 82: 9 c 
# 83: 9 d 
# 84: 9 e 
# 85: 9 f 
# 86: 9 h 
# 87: 9 i 
# 88: 9 j 
# 89: 9 k 
# 90: 9 l 
# 91: 10 NA 
# 92: 10 m 
# 93: 10 n 
# 94: 10 o 
# 95: 10 p 
# 96: 10 r 
# 97: 10 s 
# 98: 10 t 
# 99: 10 u 
# 100: 10 v 
# key1 key2 

Kommt das immer vor, oder werde ich auf Probleme stoßen, wenn ich immer annehme, dass das wahr ist?

+3

Ja, 'data.table' verhält sich wie Base R' sort (x, na.last = FALSE) 'wo immer es sortiert, und ich denke, dass die Autoren sehr wahrscheinlich bei dieser Konvention bleiben werden. Wenn Sie nur Ihre Daten sortieren möchten, sollten Sie 'setorder' berücksichtigen. Das Setzen eines Schlüssels hat andere Zwecke, wobei das Sortieren nur ein Nebeneffekt ist. Übrigens gibt es dort die Standardsyntax 'dt [sample (1: 100, 10), key2: = NA]' und Sie sollten darauf achten, dass Sie die zweistellige Zeichenkette '' NA'' für 'NA' verwechseln (nicht ein Problem in Ihrem Beispiel). – Frank

+3

Oh, stieß gerade auf diese mögliche Begründung: "NAs sind intern große negative Zahl [s]", die die Sortierung erklären kann. https://github.com/Rdatatable/data.table/issues/434 – Frank

+1

Großartig, vielen Dank! Diese sind sehr hilfreich. –

Antwort

4

Für setkey(), data.table verhält sich wie Base R sort(x, na.last=FALSE), als Sortierreihenfolge ist für die binäre Suche (immer steigend) basiert verbindet/Untergruppen. Rationale für NA erste erscheint, ist, dass:

"NAs sind intern große negative Zahl [s]" github.com/Rdatatable/data.table/issues/434


Sonstiges Kommentare: Wenn Sie schauen einfach Ihre Daten neu zu ordnen sollten Sie in Betracht ziehen setorder(), die in der Lage ist, in jeder Reihenfolge und Positionierung NA s am Anfang oder Ende zu sortieren.

By the way, die Standard-Syntax ist es dt[sample(1:100, 10), key2 := NA] und Sie sollen den zwei-stellige Zeichenfolge "NA" für NA für verkennen achten (kein Problem in Ihrem Beispiel).

+0

Danke für die Korrekturen und Ausarbeitung, @Arun – Frank