2015-05-21 18 views
5

Sử dụng dữ liệu.table, giả sử tôi đang đặt khóa bằng hai cột và một trong các cột có giá trị bị thiếu. Bảng dữ liệu dường như sắp xếp các giá trị NA cho các giá trị đầu tiên.Data.table sắp xếp giá trị NA trên cột khóa như thế nào?

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 

Điều này luôn xảy ra hay tôi gặp sự cố nếu tôi luôn cho rằng điều này là đúng?

+3

Có, 'data.table' hoạt động như cơ sở R' sắp xếp (x, na.last = FALSE) 'bất cứ nơi nào nó sử dụng phân loại, và tôi nghĩ rằng các tác giả rất có khả năng gắn bó với quy ước này. Nếu bạn chỉ đang tìm cách sắp xếp dữ liệu của mình, bạn nên xem xét 'setorder'. Thiết lập một khóa có các ứng dụng khác, với việc phân loại chỉ là một tác dụng phụ. Bằng cách này, cú pháp tiêu chuẩn có 'dt [mẫu (1: 100, 10), key2: = NA]' và bạn nên chú ý đến việc nhầm lẫn chuỗi ký tự hai "' NA "' cho 'NA' (không phải một vấn đề trong ví dụ của bạn). – Frank

+3

Ồ, chỉ cần đi qua lý do có thể có này: "NA là số lượng lớn tiêu cực nội bộ [s]", có thể giải thích việc phân loại. https://github.com/Rdatatable/data.table/issues/434 – Frank

+1

Tuyệt vời, cảm ơn bạn rất nhiều! Đây là rất hữu ích. –

Trả lời

4

Đối setkey(), data.table cư xử như cơ sở R sort(x, na.last=FALSE), như thứ tự sắp xếp (luôn luôn tăng) là điều cần thiết cho tìm kiếm nhị phân dựa tham gia/tập con. Lý do cho NA s xuất hiện đầu tiên là:

"NA là trong nội bộ lớn số âm [s]" github.com/Rdatatable/data.table/issues/434


ý kiến ​​khác: Nếu bạn chỉ tìm cách để sắp xếp lại dữ liệu của bạn , bạn nên xem xét setorder(), có khả năng sắp xếp theo thứ tự và vị trí bất kỳ NA giây khi bắt đầu hoặc kết thúc.

Nhân tiện, cú pháp chuẩn có dt[sample(1:100, 10), key2 := NA] và bạn nên cẩn thận khi nhầm lẫn chuỗi hai ký tự "NA" cho NA (không phải là sự cố trong ví dụ của bạn).

+0

Cảm ơn bạn đã sửa chữa và xây dựng, @Arun – Frank

Các vấn đề liên quan