data.table中更快的子集聚合

时间:2014-12-09 22:10:06

标签: r data.table data-mining self-join

我想在data.table中添加一个新列。此列应包含满足特定条件的所有行的其他两列的最小值。 data.table的示例如下所示:

library(data.table)
DT <- data.table(pattern=c("A", "A & B", "A & B & C", "A & C & D"),
                 value1=c(1, 2, 3, 4),
                 value2=c(5, 6, 7, 8)
)  

     pattern value1 value2
1:         A      1      5
2:     A & B      2      6
3: A & B & C      3      7
4: A & C & D      4      8

对于每行x和每行i,其中pattern [x]是pattern [i]的子模式,我想执行如下计算:

min((value1[i]-value1[x])/(value1[i]/value2[i]-value1[x]/value2[x]))

因为模式具有相似的顺序,所以我能够使用正则表达式检索子模式并替换&#34;&amp;&#34;用通配符&#34;。*&#34;并检查它是否不是模式本身。因此,我可以在每一行使用for循环:

setkey(DT,pattern)
for(i in 1:nrow(DT)) {
  DT[i, foo:=DT[grepl(gsub("&",".*",DT[i]$pattern,fixed=TRUE),pattern) & DT[i]$pattern!=pattern, 
                ifelse(.N==0,
                       NA,
                       min((DT[i]$value1-value1)/(DT[i]$value1/DT[i]$value2-value1/value2)))]]
}

不幸的是,数据集相当大,并且for循环在此数据集上非常慢。我希望有人可以帮我提供一些数据。我不知道如何解决这个问题。本质上我的问题与this one非常相似,但是给出了字符串格式的模式,因此我不能使用范围连接。

背景 模式从association rule mining输出,例如{onion&amp; amp;土豆=&gt;汉堡包}。有数千种不同的项目(例如A,B,C&amp; D)。我尝试添加统计度量来找出规则与其子规则的关系。

1 个答案:

答案 0 :(得分:0)

我不承担您想要执行的计算(我尝试运行您的代码,在其中两行中获得Inf),但作为一般概念,您可以将此作为中间步骤:

DT[, hasA := grepl("A", pattern)]
DT[, hasB := grepl("B", pattern)]
DT[, hasC := grepl("C", pattern)]
DT[, hasD := grepl("D", pattern)]
DT[, foo_0 := value1*value2]

然后从那里开始。

相关问题