Как развернуть большой фрейм данных в R

У меня есть датафрейм

df <- data.frame(
  id = c(1, 1, 1, 2, 2, 3, 3, 3, 3, 4), 
  date = c("1985-06-19", "1985-06-19", "1985-06-19", "1985-08-01", 
           "1985-08-01", "1990-06-19", "1990-06-19", "1990-06-19", 
           "1990-06-19", "2000-05-12"), 
  spp = c("a", "b", "c", "c", "d", "b", "c", "d", "a", "b"),
  y = rpois(10, 5))

   id       date spp y
1   1 1985-06-19   a 6
2   1 1985-06-19   b 3
3   1 1985-06-19   c 7
4   2 1985-08-01   c 7
5   2 1985-08-01   d 6
6   3 1990-06-19   b 5
7   3 1990-06-19   c 4
8   3 1990-06-19   d 4
9   3 1990-06-19   a 6
10  4 2000-05-12   b 6

Я хочу расширить его так, чтобы была каждая комбинация id и spp и иметьy = 0 для каждой комбинации, которая в данный момент отсутствует в кадре данных. Фрейм данных в настоящее время составляет около 100 000 строк и 15 столбцов. При расширении это будет около 300 000 столбцов (есть 17 уникальных значенийspp в моем фактическом наборе данных).

Для каждого значенияid date то же самое (например, когда id = 2, дата всегда = 1985-08-01). В моем реальном наборе данных все столбцы, кромеspp а такжеy может быть указанid.

Я хочу закончить с чем-то вроде:

   id       date spp y
   1 1985-06-19   a 6
   1 1985-06-19   b 3
   1 1985-06-19   c 7
   1 1985-06-19   d 0*
   2 1985-08-01   a 0*
   2 1985-08-01   b 0*
   2 1985-08-01   c 7
   2 1985-08-01   d 6
   3 1990-06-19   b 5
   3 1990-06-19   c 4
   3 1990-06-19   d 4
   3 1990-06-19   a 6
   4 2000-05-12   a 0*
   4 2000-05-12   b 6
   4 2000-05-12   c 0*
   4 2000-05-12   d 0*
Укажите добавленные строки

В будущем мне, вероятно, придется делать это с потенциально гораздо большими кадрами данных, поэтому быстрый, эффективный (время и память) способ сделать это будет оценен, но любое решение меня удовлетворит. Я полагаю, что должны быть способы использованияdplyr, data.table, или жеreshape пакеты, но я не очень знаком с любым из них. Я не уверен, что будет проще развернуть только строки id, spp и y, а затем сделатьleft_join() или жеmerge() рекомбинировать дату (и все другие переменные в моем реальном кадре данных) на основеid?

Ответы на вопрос(3)

Ваш ответ на вопрос