1

次のような製品のペアの類似性に関するデータフレームがあります。

   Product1   Product2  similarity   
   p1          p2         0.102
   p1          p3         0.221
   p1          p4         0.333 
   .....
   p2          p1         0.102
   p2          p3         0.201
   p2          p4         0.242 

次のような各製品について、最も類似した上位 10 個の製品を選択したいと考えています。

product.pairs<-ddply(product.pairs, "product1", transform, rank = seq_along(product1)) 
product.pairs<-subset(product.pairs, rank<11,select=c(product1,product2))

これはデータセットが小さい場合は機能しましたが、製品番号が 30k に達すると遅すぎます...

また、次のようなランクとパーティションを模倣するために、sqldfを試しました...

sql_top10<-" a.product1、a.product2、a.similarity、count(*) を productpairs a からのランクとして選択 a.product1=b.product1 および a.similarity>=b.similarity グループの a.productpairs b を a. product1,a.simlarity"

しかし、これはさらに悪いことです...何か提案はありますか?

4

1 に答える 1

3

使用data.table:

library(data.table)

dt = data.table(your_df)

# fast sort by similarity
setkey(dt, similarity)

# pick (at most) top 10 most similar ones
dt[, Product2[max(1, .N-9):.N], by = Product1]
于 2013-09-10T16:54:07.117 に答える