2012-11-06 84 views
2

我有一个data.table其包含多列,这是良好由表示以下内容:剖子集在data.table

DT <- data.table(date = as.IDate(rep(c("2012-10-17", "2012-10-18", "2012-10-19"), each=10)), 
        session = c(1,2,3), price = c(10, 11, 12,13,14), 
        volume = runif(30, min=10, max=1000)) 

我想以提取多列表,它示出了交易量按特定类型的会话中的每个价格交易 - 每列代表一个日期。

目前,我使用以下在一个时间提取该数据的一个日期:

DT[session==1,][date=="2012-10-17", sum(volume), by=price] 

然后绑定的列。

是否有一种方法可以在不将所有单个查询都粘在一起的情况下获得最终产品(每个列引用特定日期的表格) - 正如我目前所做的那样?

谢谢

+0

我误解或会'DT [,总和(体积),通过=名单(价格,日期,会话)]'不工作? – mnel

+0

@mnel - 我认为OP正在讨论将列绑定在一起(_“一个表,每列指的是一个特定的日期”)而不是行。我同样困惑。 – thelatemail

+0

恩,是的,绑定列 - 所以你没有误解我的意思。我其实只是想'DT [session == 1,sum(volume),by = list(date,price)]',并且可以从那里剪切它,使其按照我想要的日期排列。随时回答,所以我可以接受。 – ricardo

回答

2

以下是否做你想要的。

reshape2组合和data.table

library(reshape2) 

.DT <- DT[,sum(volume),by = list(price,date,session)][, DATE := as.character(date)] 
# reshape2 for casting to wide -- it doesn't seem to like IDate columns, hence 
# the character DATE co 
dcast(.DT, session + price ~ DATE, value.var = 'V1') 

    session price 2012-10-17 2012-10-18 2012-10-19 
1  1 10 308.9528 592.7259   NA 
2  1 11 649.7541   NA 816.3317 
3  1 12   NA 502.2700 766.3128 
4  1 13 424.8113 163.7651   NA 
5  1 14 682.5043   NA 147.1439 
6  2 10   NA 755.2650 998.7646 
7  2 11 251.3691 695.0153   NA 
8  2 12 791.6882   NA 275.4777 
9  2 13   NA 111.7700 240.3329 
10  2 14 230.6461 817.9438   NA 
11  3 10 902.9220   NA 870.3641 
12  3 11   NA 719.8441 963.1768 
13  3 12 361.8612 563.9518   NA 
14  3 13 393.6963   NA 718.7878 
15  3 14   NA 871.4986 582.6158 

如果你只是想会话1

dcast(.DT[session == 1L], session + price ~ DATE) 

    session price 2012-10-17 2012-10-18 2012-10-19 
1  1 10 308.9528 592.7259   NA 
2  1 11 649.7541   NA 816.3317 
3  1 12   NA 502.2700 766.3128 
4  1 13 424.8113 163.7651   NA 
5  1 14 682.5043   NA 147.1439 
+0

完美。非常感谢。 – ricardo