Вы можете использовать data.table
для быстрой обработки.Во-первых, перейдите в длинный формат, затем выполните табуляцию по номеру строки и значению, а затем поверните назад и соединитесь, чтобы получить желаемый результат
agg <- dcast(melt(DT[, rn:=.I], id.vars="rn")[, .N, by=.(rn, value)],
rn ~ value, sum, value.var="N")
DT[agg, on=.(rn)]
пример данных:
library(data.table)
set.seed(0L)
DT <- as.data.table(matrix(sample(c(-1L, 0L, 1L, NA_integer_), 5*5e6, replace=TRUE), ncol=5))
DT
edit:добавили несколько моментов.tl; д-р около 10 секунд для набора данных с 5 миллионами строк, используя data.table
dtmtd <- function() {
agg <- dcast(melt(DT[, rn:=.I], id.vars="rn")[, .N, by=.(rn, value)],
rn ~ value, sum, value.var="N")
DT[agg, on=.(rn)]
}
microbenchmark::microbenchmark(dtmtd(), times=3L)
время:
Unit: seconds
expr min lq mean median uq max neval
dtmtd() 10.07663 10.14351 10.17387 10.2104 10.22249 10.23458 3