【问题标题】:R data.table apply function with multiple column input over all rows and get reasonable outputR data.table 在所有行上应用具有多列输入的函数并获得合理的输出
【发布时间】:2015-04-17 17:24:15
【问题描述】:

我正在尝试将函数应用于 data.table 的所有行,同时使用多列作为输入,输出可能是每行的一或两行 data.frame/matrix/what-have-you .我的 data.table 有 800,000 行。

这是我最接近的尝试。在这里发挥作用的当然是输出结构的正确性、效率和易用性。

library(data.table)
d0 = as.Date("2014/01/01")
sdays = seq(d0,d0+99,by=1)
gg=data.table(id=1:100,event_date = sdays)  
setkey(gg, id)

test_func = function(id,day){
  delta = day - d0
  if(delta == 0 ){
    rcomb = c(id, 0, 100, 1,0)
  } else if(delta != 100 ){
    r1 = c(id, 0, delta, 0, 0)
    r2 = c(id, delta, 100,   1, 0)
    rcomb = rbind(r1,r2)
  }
  rcomb
}

att = gg[, test_func( get("id"), get("event_date")), by=id]
att

关于如何在这里使用快速 data.table 技巧的任何想法?我已经研究了几个小时,但还没有走得更近:/ 至于输出,我希望它是一个列表,每个原始行有一个条目,这样我就可以调用do.callrbind。谢谢!

所以让我举一个期望输出的例子,但是以一种非常低效的方式:

some_list = vector("list", 100)
for(i in 1:100) {
  some_list[[i]] <- test_func(gg$id[i], gg$event_date[i])
}
happy=do.call(rbind,some_list)
head(happy)
   [,1] [,2] [,3] [,4] [,5]
      1    0  100    1    0
r1    2    0    1    0    0
r2    2    1  100    1    0
r1    3    0    2    0    0
r2    3    2  100    1    0
r1    4    0    3    0    0

【问题讨论】:

  • 我认为你在这里不需要getgg[,test_func(id, event_date), id]
  • 是的,好点子!但它仍然给出错误的结果:|
  • 根据您的示例数据集,预期结果是什么?
  • 不完全是.. 如果您查看head(att,n=20),您会注意到顺序连接每个向量的最后部分的不规则模式。这也是一个问题,因为在数据中无法确定是否会有 1 行或 2 行输出。编辑:回应转置评论

标签: r data.table multiple-columns apply mapply


【解决方案1】:

如果您想为您的 data.table 创建 4 列,类似以下的内容将起作用

test_func = function(day){
    delta = day - d0
    if(delta == 0 ){
        rcomb = list(0, 100, 1,0)
    } else if(delta != 100 ){
     rcomb <- list(c(0,delta), c(100,delta), c(0,1), c(0,0))

    }
    rcomb
}

att = gg[, test_func(event_date), by=id]
att

【讨论】:

  • 2k 看起来效果不错!让我们看看它如何扩展到 800k
  • 这仍然太慢:/您的解决方案在测试用例中是正确的。我想我可能只是尝试并行化这个......
  • 哇,我几乎放弃了它,但花了大约一分钟,正负。到目前为止,这是我能够与之合作的最佳选择,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 2017-06-29
  • 1970-01-01
相关资源
最近更新 更多