为 data.table 合成一个整数键
Synthesize an integer key for a data.table
我有一个 data.table
,数据按 2 列 key1
和 key2
分组。我想要实现的是获得一个枚举所有现有 (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)]
请注意,第二个的输出将与第一个不同,一般来说——后者将按 key1
和 key2
排序;前者不一定是这种情况。这可能会或可能不会更有效,具体取决于您的数据。如果要强制第一种情况排序,只需修改为[order(key1,key2),id:=.I]
我有一个 data.table
,数据按 2 列 key1
和 key2
分组。我想要实现的是获得一个枚举所有现有 (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)]
请注意,第二个的输出将与第一个不同,一般来说——后者将按 key1
和 key2
排序;前者不一定是这种情况。这可能会或可能不会更有效,具体取决于您的数据。如果要强制第一种情况排序,只需修改为[order(key1,key2),id:=.I]