在data.table中创建一个count变量

时间:2015-08-12 16:41:55

标签: r data.table

我想为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的实现。但是,该问题的第二个替代答案与此问题的答案相同,所以我可以称之为重复。道歉。

1 个答案:

答案 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