3

一意の 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

4

1 に答える 1

4

あなたのアルゴリズムは N^2 比較を行うようです。たぶん、次のようなものがより適切にスケーリングされます。これは全体の小さなサブセットであると考えて、重複した売上を見つけます。

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

オペレーターは%in%非常にうまくスケーリングします。次に、ID に基づいてサイズ列を分割し、複数のサイズを持つ ID をチェックします。

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

これにより、ID ごとに複数のサイズがあることを示す TRUE を使用して、名前付きの論理ベクトルが与えられます。これは、重複販売の数にほぼ比例して増減します。これを高速化する巧妙な方法があるため、複製されたデータ自体が大きい場合は...

うーん、もう少し考えてみると、

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

トリックを行います。

于 2013-03-28T19:51:53.187 に答える