【问题标题】:Faster subset aggregation in data.tabledata.table 中更快的子集聚合
【发布时间】:2015-02-07 23:42:00
【问题描述】:

我想在我的 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 非常相似,但是给出了字符串格式的模式,因此我不能使用范围连接。

背景: 这些模式是从association rule mining 输出的,例如 {onion & potato => burger}。有数千种不同的项目(例如示例中的 A、B、C 和 D)。我尝试添加一个统计度量来找出规则与其子规则的关系。

【问题讨论】:

  • 您的数据有多大(行、列和大小)?你拥有的模式中最多的元素是多少,即 A & B & C & D & E & F & .. - 你可以拥有的最大元素是多少?
  • 我在大约 600.908 行、12 列(模式在一列中)和 181 Mb 的样本集上执行了它。我想在至少 10 倍大的数据集上执行它。这些模式实际上是 item1=valueA & item2=valueB & ... - 现在有 15 个项目的值范围从 2(二进制)到 1.000 个分类值。

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


【解决方案1】:

我不了解您要执行什么计算(我尝试运行您的代码,在其中两行中获得了 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]

然后从那里出发。

【讨论】:

  • 感谢塞尔班。不同的模式组合数以千计,计算比给定的更复杂,所以我无法用你的解决方案解决。
  • 我用更多背景更新了这个问题,并修复了 Inf(这些实际上是没有子规则的关联规则,所以现在我在这些情况下返回 NA)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多