使用data.table随时间创建组变量

时间:2017-02-21 14:08:58

标签: r data.table

在20年的时间里,我有大约200家美国公司的每日观察数据集。我想构建一个每天取值1-10的组变量,具体取决于例如公司的规模。我正在使用data.table和函数ntile(size,10)来创建组。

我试过

DT[,decile:=(ntile(size,10)),by=date]

但它不起作用。 DT是我的data.table,其中包括变量date,size,price,companyid等

2 个答案:

答案 0 :(得分:0)

这是一个简单的玩具示例:DT = data.table( name=c("A","A","A","A","B","B","B","B","C","C","C","C","D","D","D","D"), date=1:4, size=c(100, 101, 103, 102, 50, 51, 50 ,49, 200, 201, 202, 205, 95, 96, 98, 110) ) DT[,decile:=(ntile(size,2)),by=date]

答案 1 :(得分:0)

使用稍大的示例数据集,我可以构建一个组变量,如下所示:

# sample data
DT = data.table(
  firm= rep(LETTERS, each = 20),
  date = 1:20,
  size = sample(1:250, length(LETTERS) * 20, replace = TRUE))

# sort and assign group rank
setkey(DT, date, size)
DT[, grouprank := (1:.N) %/% 10L, by = date]

这将在每个单独的日期为每个公司分配一个大小组排名,从单个日期的结果子集中可以看出:

DT[date == 1]

    firm date size grouprank
 1:    J    1   15         0
 2:    L    1   37         0
 3:    K    1   57         0
 4:    Q    1   64         0
 5:    R    1   64         0
 6:    C    1   81         0
 7:    E    1   86         0
 8:    I    1  106         0
 9:    O    1  117         0
10:    B    1  118         1
11:    X    1  119         1
12:    A    1  135         1
13:    H    1  138         1
14:    D    1  140         1
15:    F    1  162         1
16:    N    1  171         1
17:    M    1  178         1
18:    S    1  178         1
19:    T    1  181         1
20:    G    1  188         2
21:    Y    1  196         2
22:    P    1  204         2
23:    W    1  205         2
24:    V    1  244         2
25:    Z    1  245         2
26:    U    1  247         2
    firm date size grouprank