data.table如何对关键列上的NA值进行排序?

5
使用data.table,假设我正在使用两列设置键,并且其中一列具有缺失值。Data table似乎会将NA值排序到第一个位置。
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

这种情况是否总是发生,如果我总是假设它是真的,是否会遇到问题?


3
是的,data.table在使用排序时的行为类似于基本R中的sort(x, na.last=FALSE),我认为作者们很可能会坚持这个惯例。如果你只是想对数据进行排序,你应该考虑使用setorder。设置键值有其他用途,排序只是一个副作用。顺便提一下,标准语法是dt[sample(1:100, 10), key2:=NA],你应该注意不要将两个字符的字符串“'NA'”误认为是NA(在你的例子中不是问题)。 - Frank
3
刚刚看到了一个可能的解释:“NA 在内部被表示为一个非常小的负数”,这可能解释了排序问题。详情请见:https://github.com/Rdatatable/data.table/issues/434 - Frank
1
非常好,非常感谢!这些非常有帮助。 - Jake Fisher
1
@Frank,你能把你的评论放在答案里吗?这样我们就可以消除标签上未回答的问题了 :) - jangorecki
@jangorecki 好的,已经完成了。关于NA值是大负数的更好参考可能存在,但我想这个也可以。谢谢。 - Frank
1个回答

4
对于setkey()data.table的行为类似于基本的R sort(x, na.last=FALSE),因为排序顺序(始终递增)对于基于二进制搜索的连接/子集非常重要。出现NA首先的原因是:

"NAs在内部是大负数" github.com/Rdatatable/data.table/issues/434


< p > < em > 其他评论: 如果你只是想重新排序你的数据,你应该考虑使用 setorder() ,它能够按任何顺序排序并将 NA 定位在开头或结尾。

顺便说一句,在那里的标准语法是 dt [sample(1:100,10),key2:=NA],你应该注意不要将两个字符的字符串 "NA" 错误地看成 NA(在你的例子中不是问题)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接