我在data.table中的参数(计算结果为逻辑的表达式)

时间:2012-08-20 15:53:25

标签: r group-by subset data.table

我有以下内容:

test <- data.table(id=1:11, t=c(rep(1:2,5), 3))
test[length(unique(id))>1,list(id, t), by=t]

    id t
 1:  1 1
 2:  2 2
 3:  3 1
 4:  4 2
 5:  5 1
 6:  6 2
 7:  7 1
 8:  8 2
 9:  9 1
10: 10 2
11: 11 3

我希望这可以按testt进行分组,评估每个组的j语句,并返回i为真的行(即更多比1个唯一的id)。而是返回的是:

> test
     id t
 1:  1 1
 2:  2 2
 3:  3 1
 4:  4 2
 5:  5 1
 6:  6 2
 7:  7 1
 8:  8 2
 9:  9 1
10: 10 2  
11: 11 3

似乎by仅适用于j而不适用于i。这里有什么建议吗?

1 个答案:

答案 0 :(得分:4)

正确或错误地,i先运行j然后byi的所有行上test[,list(id, u=length(unique(id))), by=t][u>1] 运行。

一个常见的习语是这样的(类似于SQL中的HAVING):

u

并从结果中排除test[,list(id, u=length(unique(id))), by=t][u>1][,u:=NULL] (每个组中唯一ID的数量):

i

顺便说一句,在u>1上进行矢量扫描(小得多)聚合结果(例如上面一行中的j)比对(更大)原始数据进行矢量扫描要有效得多

如果by在整个数据集上按i运行,后跟结果[(如您所料),则会导致效率问题。考虑一下它是否有效。然后首先对结果进行分组,然后对结果进行分组,则需要将其拆分为两个DT[i][,j,by]调用:i。然后j没有看到[.data.tableDT[i,j,by]内)并且不知道它需要哪些列。将其合并为一个i,{}允许j在评估前检查j,并仅对i所需的列进行子集化。这对使用一小部分列的查询的大型数据集产生了很大的差异。


要查看发生的情况,请转发j并将其设为test[,length(unique(id))>1] # [1] TRUE

TRUE

然后单个DT[TRUE] == DT被回收。 i。您始终可以j进行{{1}}测试{。}}。