2015-05-21 12 views
5

Korzystając z data.table, powiedz, że ustawiam klucz za pomocą dwóch kolumn, a jedna z kolumn ma brakujące wartości. Tabela danych wydaje się sortować wartości NA do pierwszych wartości.Jak sortuje dane NA na klucz kolumnach?

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 

Czy to się zawsze zdarza, czy też napotkasz problemy, jeśli zawsze zakładam, że to prawda?

+3

Tak, 'data.table' zachowuje się jak baza R' sort (x, na.last = FALSE) 'gdziekolwiek używa sortowania i myślę, że autorzy są bardzo skłonni trzymać się tej konwencji. Jeśli chcesz tylko posortować dane, powinieneś rozważyć ustawienie 'setorder'. Ustawienie klawisza ma inne zastosowania, a sortowanie jest tylko efektem ubocznym. Nawiasem mówiąc, standardowa składnia to 'dt [sample (1: 100, 10), key2: = NA]' i powinieneś uważać na pomylenie dwuznakowego ciągu '" NA "' dla 'NA' (nie problem w twoim przykładzie). – Frank

+3

Och, właśnie natknęliśmy się na tę możliwą racjonalność: "NAs mają wewnętrznie dużą liczbę ujemną [s]", co może wyjaśniać sortowanie. https://github.com/Rdatatable/data.table/issues/434 – Frank

+1

Świetnie, dziękuję bardzo! Są bardzo pomocne. –

Odpowiedz

4

Dla setkey(), data.table zachowuje się jak bazowej R sort(x, na.last=FALSE), jak kolejność sortowania (zawsze rosnącej) jest niezbędna do wyszukiwania binarnego oparciu łączy/podzbiorów. Uzasadnieniem NA s pojawiających Pierwszym z nich jest, że:

"NAS są wewnętrznie duża liczba ujemna [s]" github.com/Rdatatable/data.table/issues/434


Różne komentarze: Jeśli tylko chcą uporządkować swoje dane , powinieneś wziąć pod uwagę setorder(), który jest w stanie sortować w dowolnej kolejności i pozycjonować na początku lub na końcu na NA s.

Nawiasem mówiąc, standardowa składnia to: dt[sample(1:100, 10), key2 := NA] i powinieneś uważać, aby nie pomylić dwuznakowego ciągu znaków "NA" dla NA (nie stanowi to problemu w twoim przykładzie).

+0

Dzięki za poprawki i opracowanie, @Arun – Frank

Powiązane problemy