gpt4 book ai didi

r - data.table 中更快的子集聚合

转载 作者:行者123 更新时间:2023-12-02 04:51:57 24 4
gpt4 key购买 nike

我想在我的 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-loop 在这个数据集上非常慢。我希望有人可以用我不知道的 data.table 魔法来帮助我解决这个问题。从本质上讲,我的问题与 this one 非常相似。 , 但给出了字符串格式的模式,因此我不能使用范围连接。

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

最佳答案

我不明白你想执行什么计算(我试过运行你的代码,在两行中得到了 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]

然后从那里开始。

关于r - data.table 中更快的子集聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27389826/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com