我有一些数据涉及一堆具有独特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
答案 0 :(得分:4)
看起来您的算法进行了N ^ 2比较。也许以下类似的东西会更好地扩展。我们发现重复销售,认为这是总数的一小部分。
dups = unique(Data$ID[duplicated(Data$ID)])
DupData = Data[Data$ID %in% dups,,drop=FALSE]
%in%
运算符非常好。然后根据id拆分size列,检查具有多个大小的id
tapply(DupData$Size, DupData$ID, function(x) length(unique(x)) != 1)
这给出了一个命名的逻辑向量,其中TRUE表示每个id有多个大小。这与重复销售的数量大致呈线性关系;有一些聪明的方法可以让它变得更快,所以如果你的重复数据本身很大......
嗯,考虑一下这个,我想u = unique(Data)
u$ID[duplicated(u$ID)]
诀窍。