如何加快这个ddply?

时间:2013-09-10 16:40:51

标签: r sqldf

我有关于产品对的相似性的数据框,例如:

   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 

我想为每种产品选择十大最相似的产品,例如

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

这在数据集较小时有效,但一旦产品数量达到30k,就太慢了......

我也尝试过sqldf,模仿等级&amp;分区,例如......

sql_top10&lt; - “选择a.product1,a.product2,a.similarity,count(*)作为排名 来自产品对a 在a.product1 = b.product1和a.similarity&gt; = b.similarity上加入productpairs b group by a.product1,a.simlarity“

但这更糟糕......有什么建议吗?

1 个答案:

答案 0 :(得分: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]