使用R中的data.table通过muli-variate组生成递归ID

时间:2015-07-13 19:46:40

标签: 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), 
                 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

2 个答案:

答案 0 :(得分:4)

这似乎回归了你想要的东西

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

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

答案 1 :(得分:4)

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

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