为 data.table 合成一个整数键

Synthesize an integer key for a data.table

我有一个 data.table,数据按 2 列 key1key2 分组。我想要实现的是获得一个枚举所有现有 (key1, key2) 对的整数键。例如。到如下所示的数据集:

    key1  key2  data
    A     1     ...
    A     1     ...
    A     2     ...
    C     1     ...
    B     1     ...
    B     1     ...
    C     1     ...

我想添加一个 id 列来枚举:

  id  key1  key2    data
  1     A     1     ...
  1     A     1     ...
  2     A     2     ...
  3     C     1     ...
  4     B     1     ...
  4     B     1     ...
  3     C     1     ...

我不关心 id 的分布顺序,我只需要能够根据单个数字而不是一对键列对 table 进行子集化。如何实现?

有几个选项。

您可以执行以下任一操作:

dt[unique(dt,by=c("key1","key2"))[,id:=.I],id:=i.id,on=c("key1","key2")]

或者(正如@Khashaa 在评论中优雅地指出的那样;事实上,考虑到 function was created for cases just like this

,这可能是@Arun 喜欢的方式
setkey(dt,key1,key2)[,id:=rleid(key1,key2)]

请注意,第二个的输出将与第一个不同,一般来说——后者将按 key1key2 排序;前者不一定是这种情况。这可能会或可能不会更有效,具体取决于您的数据。如果要强制第一种情况排序,只需修改为[order(key1,key2),id:=.I]