【问题标题】:Data.table - lapply function within .SD with merge not workingData.table - .SD 中的 lapply 函数,合并不起作用
【发布时间】: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


【解决方案1】:

我猜你想这样做:

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

【讨论】:

  • 以上内容适用于 .SD 周围的副本 - 谢谢!如果我进行单次合并,我会得到一个巨大的表(超过 5 亿行),这是我试图避免做的事情。
猜你喜欢
  • 2015-11-23
  • 2016-08-23
  • 1970-01-01
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 2020-05-03
  • 1970-01-01
相关资源
最近更新 更多