请考虑一个具有数百万行的大型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
,并为指定的列返回所需的结果。
答案 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中使用基于矢量和列表的函数,而不是将它们转换为矩阵对象。