【发布时间】:2015-11-13 12:37:24
【问题描述】:
我正在做一些产品关联工作,我有两个大型 data.tables。一个是规则表(2.4m 行),一个是客户产品表(3m 行)。实际上,我想要做的是将两者合并在一起并选择每个客户的前 10 种产品,但由于规模的原因,在高级别上这样做是不可行的。但是,为了解决这个问题,我想在客户级别迭代地合并这两个表,选择前 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 数据表的列表在尝试重新备份时出现问题。
任何想法为什么 .SD 中的合并不起作用?
干杯, 斯科特
【问题讨论】:
-
当您拥有 30k data.tables 列表时,尝试将它们重新组合在一起时会出现什么错误?
-
code"malloc 在 rbindlist.c 中失败。这部分代码将被重做。"
标签: r data.table lapply