如何在数据表的每一行上有效地应用可归约函数

时间:2019-03-17 12:41:52

标签: r data.table

请考虑一个具有数百万行的大型data.table对象dt,如下所示:

     event1 event2 event3 event4 event5
  1:   TRUE  FALSE  FALSE  FALSE  FALSE
  2:   TRUE  FALSE  FALSE  FALSE  FALSE
  3:   TRUE  FALSE  FALSE  FALSE  FALSE
  4:   TRUE  FALSE  FALSE  FALSE  FALSE
  5:   TRUE  FALSE  FALSE  FALSE  FALSE
...

我希望在五列的每一行上有效地应用 一个“或”函数。更一般而言,我希望创建一个函数,该函数接收dt和列名向量cols,并为指定的列返回所需的结果。

1 个答案:

答案 0 :(得分:5)

通过使用Reduce函数(r-base)实现有效的解决方案:

row_any <- function(dt, cols) {
  return(dt[, Reduce(`|`, .SD), .SDcols=cols])
}

例如,以下是大约320万行的时间:

system.time(res <- row_any(dt, cols))
  user  system elapsed 
  0.028   0.000   0.029 

大多数行功能解决方案在边距1(行)上使用apply函数。不建议使用此方法,因为它将.SD列转换为矩阵,因此放弃了data.table的效率属性:

system.time(res2 <- dt[, apply(.SD, 1, any), .SDcols=cols])
  user  system elapsed 
  3.740   0.000   3.747 

这里的重点是,您应该在data.table中使用基于矢量和列表的函数,而不是将它们转换为矩阵对象。