【问题标题】:data.table "key indices" or "group counter"data.table “关键索引”或“组计数器”
【发布时间】:2012-10-12 16:35:57
【问题描述】:

在 data.table 上创建键后:

set.seed(12345)
DT <- data.table(x = sample(LETTERS[1:3], 10, replace = TRUE),
                 y = sample(LETTERS[1:3], 10, replace = TRUE))
setkey(DT, x, y)
DT
#       x y
#  [1,] A B
#  [2,] A B
#  [3,] B B
#  [4,] B B
#  [5,] C A
#  [6,] C A
#  [7,] C A
#  [8,] C A
#  [9,] C C
# [10,] C C

我想获得一个整数向量,为每一行提供相应的“键索引”。我希望下面的预期输出(i 列)将有助于澄清我的意思:

#       x y i
#  [1,] A B 1
#  [2,] A B 1
#  [3,] B B 2
#  [4,] B B 2
#  [5,] C A 3
#  [6,] C A 3
#  [7,] C A 3
#  [8,] C A 3
#  [9,] C C 4
# [10,] C C 4

我考虑过使用cumsum(!duplicated(DT[, key(DT), with = FALSE])) 之类的东西,但希望有更好的解决方案。我觉得这个向量可能是表格内部表示的一部分,也许有办法访问它?即使不是这样,你有什么建议?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    更新:从v1.8.3,您可以简单地使用内置的特殊.GRP

    DT[ , i := .GRP, by = key(DT)]
    

    查看历史以获取较早的答案。

    【讨论】:

    • 我认为.GRP 是一个非常好的主意,并且过去一直希望它。不错且看似最佳的解决方案,顺便说一句。
    • @JoshO'Brien 好的,.GRP 现在在 1.8.3 中。
    • 如何找到有关这些变量和其他变量的文档,例如.SDcols? ??.GRP
    【解决方案2】:

    我可能会这样做,因为我相当有信心在对 [.data.table() 的调用中没有可用的索引计数器:

    ii <- unique(DT)
    ii[ , i := seq_len(nrow(ii))]
    DT[ii]
    #     x y i
    #  1: A B 1
    #  2: A B 1
    #  3: B B 2
    #  4: B B 2
    #  5: C A 3
    #  6: C A 3
    #  7: C A 3
    #  8: C A 3
    #  9: C C 4
    # 10: C C 4
    

    您可以将其设为单行,但需要额外致电 unique.data.table()

    DT[unique(DT)[ , i := seq_len(nrow(unique(DT)))]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多