在 R 中使用 data.table 通过多变量组生成递归 ID

Generating recursive ID by muli-variate group using data.table in R

我找到了几个关于如何使用 R 中的 data.table 包按组生成 ID 的选项,但其中 none 完全符合我的问题。希望有人能提供帮助。

在我的问题中,我有 160 个市场,属于一个国家/地区的 21 个地区。这些市场编号为 1:160,每个市场中可能记录了多个观察结果。我想重组我的市场 ID 变量,使其代表每个地区内的独特市场,并在每个新地区重新开始计数。

下面是一些代码来表示我的问题:

require(data.table)
dt <- data.table(region = c(1,1,1,1,2,2,2,2,3,3,3,3), 
                 market = c(1,1,2,2,3,3,4,4,5,6,7,7))
> dt
    region market
 1:      1      1
 2:      1      1
 3:      1      2
 4:      1      2
 5:      2      3
 6:      2      3
 7:      2      4
 8:      2      4
 9:      3      5
10:      3      6
11:      3      7
12:      3      7

目前,我的数据设置为表示

的结果

dt[, market_new := .GRP, by = .(region, market)]

但我想要的是

    region market market_new
 1:      1      1          1
 2:      1      1          1
 3:      1      2          2
 4:      1      2          2
 5:      2      3          1
 6:      2      3          1
 7:      2      4          2
 8:      2      4          2
 9:      3      5          1
10:      3      6          2
11:      3      7          3
12:      3      7          3

这好像return你想要的

dt[, market_new:=as.numeric(factor(market)), by=region]

这里我们按地区划分数据,然后通过factor()函数为每个地区的每个市场赋予唯一ID,并提取基础数字索引。

1.9.5+ 开始,您可以将 frank()(或 frankv())与 ties.method = "dense" 一起使用,如下所示:

dt[, market_new := frankv(market, ties="dense"), by=region]