Data.table - .SD内的lapply函数,合并不起作用

时间:2015-11-13 12:37:25

标签: r data.table lapply

我正在做一些产品协会工作,我有两个大型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中合并的任何想法都不起作用?

干杯, 斯科特

1 个答案:

答案 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