我正在做一些产品协会工作,我有两个大型data.tables。一个是规则表(2.4m行),一个是客户产品表(3m行)。实际上,我想要做的是将两者合并在一起,并为每个客户选择前十大产品,但由于尺寸的原因,在高水平上这样做是不可行的。但是,为了解决这个问题,我想在客户级别迭代合并两个表,选择前10个产品并将其返回。
以下示例可能更好地解释了它:
require(data.table)
customer <- data.table(customer=rep(seq(1:5),3),product_bought=rep(c("A","B","C"),5), number=runif(15))[order(customer)]
rules <- data.table(product_bought=c("A","B","C"),recommended_product=c("D","E","F"),number2=runif(3,min=100,max=200))
customer[,lapply(.SD, function(z){
a <- merge(z,rules,by="product_bought")
a[,new:=number*number2]
a[new==max(new)]
return(a)
}),by=customer]
但是我收到以下错误:
Error in fix.by(by.x, x) : 'by' must specify a uniquely valid colum
我希望它为所有客户做的是:
z <- customer[customer==1]
a <- merge(z,rules,by="product_bought")
a[,new:=number*number2]
a[new==max(new)]
给出了:
> a[new==max(new)]
product_bought customer number recommended_product number2 new
1:
C 1 0.613043 F 168.4335 103.257
我确实尝试使用列表,但是有一个30k data.tables的列表在尝试再次将其重新备份时出现问题。
.SD中合并的任何想法都不起作用?
干杯, 斯科特
答案 0 :(得分:0)
我猜你是想这样做的:
customer[, {
a <- merge(.SD,rules,by="product_bought");
a[, new:=number*number2];
a[new==max(new)]
}, by = customer]
但是进行单一合并要好得多:
customer[rules, on = 'product_bought', new := number * number2]
customer[, .SD[new == max(new)], by = customer]
如果最后一行太慢,请执行.I
trick。