我想为data.table中的每个唯一值(特定变量或变量组)创建一个从1开始计数的变量。
(mydata <- data.frame(cat = c('a','a','a','b','c','c','c','c'),
color = c( 1, 1, 1, 2, 1, 1, 1, 1),
hat = c( 1, 1, 2, 2, 1, 2, 1, 2),
shoe = c( 0, 1, 1, 2, 1, 1, 1, 3)))
cat color hat shoe
1 a 1 1 0
2 a 1 1 1
3 a 1 2 1
4 b 2 2 2
5 c 1 1 1
6 c 1 2 1
7 c 1 1 1
8 c 1 2 3
foo(mydata)
cat color hat shoe i
1 a 1 1 0 1
2 a 1 1 1 2
3 a 1 2 1 3
4 b 2 2 2 1
5 c 1 1 1 1
6 c 1 2 1 2
7 c 1 1 1 3
8 c 1 2 3 4
我正在考虑mydata[, count = 1:length(Cat), by=.(Cat)]
这一行,但这似乎不起作用。
我认为这个问题与Create counter with multiple variables不同,因为它特别询问了data.table的实现。但是,该问题的第二个替代答案与此问题的答案相同,所以我可以称之为重复。道歉。
答案 0 :(得分:3)
你猜得非常接近,你只需要使用sequence
> DT <- data.table(mydata)
> DT[, i := sequence(.N), by = cat]
> DT
cat color hat shoe i
1: a 1 1 0 1
2: a 1 1 1 2
3: a 1 2 1 3
4: b 2 2 2 1
5: c 1 1 1 1
6: c 1 2 1 2
7: c 1 1 1 3
8: c 1 2 3 4
通过更改by
参数,您可以根据列组创建其他序列。
<强>更新强>
正如@ veerendra-gadekar的评论中所建议的那样,使用setDT
> setDT(mydata)[, i := sequence(.N), by = cat]
> mydata
cat color hat shoe i
1: a 1 1 0 1
2: a 1 1 1 2
3: a 1 2 1 3
4: b 2 2 2 1
5: c 1 1 1 1
6: c 1 2 1 2
7: c 1 1 1 3
8: c 1 2 3 4