R 检查重复项的速度非常慢,即使使用 mclapply

2024-01-15

我有一些涉及重复销售大量具有唯一 ID 的汽车的数据。一辆车可以多次出售。

然而,有些 Id 是错误的,因此我正在检查每个 Id 的尺寸在多次销售中是否记录为相同。如果不是,那么我就知道 Id 是错误的。

我正在尝试使用以下代码来做到这一点:

library("doMC")

Data <- data.frame(ID=c(15432,67325,34623,15432,67325,34623),Size=c("Big","Med","Small","Big","Med","Big"))
compare <- function(v) all(sapply( as.list(v[-1]), FUN=function(z) {isTRUE(all.equal(z, v[1]))}))

IsGoodId = function(Id){
  Sub = Data[Data$ID==Id,]
  if (length(Sub[,1]) > 1){
    return(compare(Sub[,"Size"]))
  }else{
    return(TRUE)
  }
}

WhichAreGood = mclapply(unique(Data$ID),IsGoodId)

但在我的四核 i5 上,速度慢得令人痛苦、非常、非常慢。

谁能看出瓶颈在哪里吗?我是 R 优化的新手。

谢谢, -N


看起来你的算法进行了 N^2 次比较。也许像下面这样的东西会更好地扩展。我们发现重复销售,认为这只是总数的一小部分。

dups = unique(Data$ID[duplicated(Data$ID)])
DupData = Data[Data$ID %in% dups,,drop=FALSE]

The %in%运算符的扩展性非常好。然后根据 id 拆分尺寸列,检查 id 是否具有多个尺寸

tapply(DupData$Size, DupData$ID, function(x) length(unique(x)) != 1)

这给出了一个命名的逻辑向量,其中 TRUE 表示每个 id 有多个大小。这与重复销售的数量大致呈线性关系;有一些聪明的方法可以让这个过程变得更快,所以如果你的重复数据本身很大......

嗯,我想再考虑一下这个问题

u = unique(Data)
u$ID[duplicated(u$ID)]

就可以了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R 检查重复项的速度非常慢,即使使用 mclapply 的相关文章

随机推荐