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

标签 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和列名 vector cols,并为指定的列返回所需的结果。

最佳答案

使用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中使用基于 vector 和列表的函数,而不是将它们转换为矩阵对象。

关于r - 如何在数据表的每一行上有效地应用可归约函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55207162/

相关文章:

r - 如何计算 R 中两个向量之间不同的众所周知的相似性或距离度量?

R数据表——简明表达多个子集条件

r - 如何在R data.table中有效地找到具有非零值的最后一行

r - 使用 dplyr 进行汇总并保持相同的变量名

r - 使用 R 中的应用系列并行化用户定义的函数

r - 批处理 R 脚本 - 设置工作目录并选择输出文件夹

python - 绕过 'important information page'时进行网络爬行

r - dplyr:独特和独特之间的区别

r - 将数组与 R 中的 data.table 相乘

R data.table 如何创建重复项