我找到了几个关于如何使用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
答案 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]