Для этой проблемы пакеты bigmemory
и bigtabulate
могут быть вашими друзьями.Вот немного более амбициозный пример:
library(bigmemory)
library(bigtabulate)
set.seed(123)
dd <- data.frame(
id = sample( 1:15, size=2e6 , replace=T ),
prd = letters[sample( 1:15, size=2e6 , replace=T )]
)
prds <- unique(dd$prd)
benchmark(
bigtable(dd,c(1,2))>0,
table(dd[,1],dd[,2])>0,
xtabs(~id+prd,data=dd)>0,
tapply( dd$prd , dd$id , function(x) prds %in% x )
)
И результаты бенчмаркинга (я постоянно учусь чему-то новому):
test replications elapsed relative user.self sys.self user.child sys.child
1 bigtable(dd, c(1, 2)) > 0 100 54.401 1.000000 51.759 3.817 0 0
2 table(dd[, 1], dd[, 2]) > 0 100 112.361 2.065422 107.526 6.614 0 0
4 tapply(dd$prd, dd$id, function(x) prds %in% x) 100 178.308 3.277660 166.544 13.275 0 0
3 xtabs(~id + prd, data = dd) > 0 100 229.435 4.217478 217.014 16.660 0 0
И это показывает bigtable
выигрышна значительную сумму.Результаты в значительной степени совпадают с тем, что все prds находятся во всех идентификаторах, но подробности о формате результатов см. В ?bigtable
.