Причина, по которой ddply
занимает так много времени, заключается в том, что разбиение по группам не выполняется параллельно (только вычисления для «разбиений»), поэтому при большом количестве групп оно будет медленным (и .parallel = T
) не поможет.
Подход, использующий data.table::dcast
(data.table
версия> = 1.9.2), должен быть чрезвычайно эффективным во времени и памяти.В этом случае мы можем положиться на значения аргументов по умолчанию и просто использовать:
library(data.table)
dcast(setDT(data), id ~ week)
# Using 'week' as value column. Use 'value.var' to override
# Aggregate function missing, defaulting to 'length'
# id 1 2 3
# 1: 1 2 1 1
# 2: 2 0 0 1
Или установить аргументы явно:
dcast(setDT(data), id ~ week, value.var = "week", fun = length)
# id 1 2 3
# 1: 1 2 1 1
# 2: 2 0 0 1
Для pre- data.table
1.9.2 варианта, см. Правки.