更快的数据表子集聚合

3

我想在我的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]))

由于这些模式具有类似的顺序,我可以使用正则表达式检索子模式,并将“&”替换为通配符“.*”,然后检查它是否不是模式本身。因此,我可以在每一行上使用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循环处理速度非常慢。我希望有人能帮我用一些我不知道的data.table技巧解决这个问题。本质上,我的问题与this one相似,但是给出了字符串格式的模式,因此我无法使用范围连接。
背景: 这些模式是从关联规则挖掘中输出的,例如{洋葱和土豆=>汉堡}。有成千上万种不同的物品(例如示例中的A、B、C和D)。我试图添加一个统计量来找出规则与其子规则之间的关系。

你的数据有多大(行数、列数和大小)?你的模式中最多有多少个元素,例如 A & B & C & D & E & F & .. - 你能有的最大元素数量是多少? - Arun
我对大约600,908行,12列(模式在一列中)和181 Mb的样本集执行了此操作。我想在至少比这个数据集大10倍的数据集上执行此操作。实际上,这些模式是item1=valueA&item2=valueB&...-现在有15个项目,其值范围从2(二进制)到1,000个分类值不等。 - Roy van der Valk
1个回答

0
我不明白你想进行什么计算(我尝试运行了你的代码,在两行中得到了无穷大),但作为一个一般的思路,你可以将它作为中间步骤来处理:
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]

然后从那里开始。


谢谢Serban。不同的模式组合有成千上万种,计算比给定的更复杂,所以我不能用你的解决方案来解决它。 - Roy van der Valk
我更新了问题,提供了更多背景信息和 Inf 的修复(实际上这些是没有子规则的关联规则,所以现在在这些情况下返回 NA)。 - Roy van der Valk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接