我有关于产品对的相似性的数据框,例如:
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“
但这更糟糕......有什么建议吗?
答案 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]