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

使用R中的data.table通过多变量组生成递归ID,r,data.table,R,Data.table,关于如何使用R中的data.table包按组生成ID,我找到了几个选项,但没有一个完全适合我的问题。希望有人能帮忙 在我的问题中,我有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)

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

在我的问题中,我有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:=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]

可能
为.integer
?哦,或者
unclass
,这样效果很好!非常感谢。我知道它必须很简单,只是一个参考
dt[,market\u new:=rleid(market),by=region]
也会产生相同的结果。
dt[, market_new := frankv(market, ties="dense"), by=region]