2014-11-20 74 views
1

时,请“通过”变量我有一个非常大的data.table:只有崩溃data.table

DT <- data.table(a=c(1,1,1,1,2,2,2,2,3,3,3,3),b=c(1,1,2,2),c=1:12) 

我需要将其折叠by几个变量,例如列表(A,B)。易:

DT[,sum(c),by=list(a,b)] 

    a b V1 
1: 1 1 3 
2: 1 2 7 
3: 2 1 11 
4: 2 2 15 
5: 3 1 19 
6: 3 2 23 

不过,我不想承担c任何操作,我只是想砸:

DT[,,by=list(a,b)]  # includes a,b,c, thus does not collapse 
DT[,list(),by=list(a,b)] # zero rows 
DT[,a,by=list(a,b)]  # what I want but adds extraneous column a after 'by' columns 

如何指定以下X得到指示的结果?

DT[,X,by=list(a,b)] 

    a b 
1: 1 1 
2: 1 2 
3: 2 1 
4: 2 2 
5: 3 1 
6: 3 2 

回答

1

unique.data.tableby参数,然后你可以子集的结果得到你想要的列。

例如

unique(DT, by = c('a', 'b'))[, c('a','b'), with = FALSE] 
+0

接受,但我用:'DT [,B,通过=列表(A,B)] [,B:= NULL]'代替。在实践中,我的'by'列表很长(5-6个变量),甚至更长。但是知道没有一个优雅的方法可以做到这一点很有帮助('unique'这里仍然包含'c'列,你已经用子查询排除了,因为我也有)。由于子查询删除* first *列'b',所以我使用列'b',因此复制除最后一列之外的任何内容都会导致我的列顺序发生更改。 – rjturn 2014-11-21 14:26:21