考虑一个具有数百万行的大型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/