Этот вопрос уже сделан. Но я хочу оставить другой способ, используя data.table для вас. Я прочитал ваш комментарий выше. Следовательно, мой вывод отличается от вывода tmfmnk. Здесь я использовал подмножества в качестве объединений. Я в основном создаю все возможные комбинации var1, var2 и var3. Длина var2 и var3 (var3 имеет 1: 6 для каждого значения var2) расположены так, что их длины совпадают. После этого я заменил NA на 0, используя nafill()
.
library(data.table)
setDT(foo)[.(var1,
rep(unique(var2), each = max(var3)),
rep(1:max(var3), times = uniqueN(var2))),
on = .(var1, var2, var3)][, count := nafill(count, fill = 0)][]
var1 var2 var3 count
1: 123 45 1 1
2: 123 45 2 0
3: 123 45 3 0
4: 123 45 4 0
5: 123 45 5 0
6: 123 45 6 0
7: 123 57 1 0
8: 123 57 2 0
9: 123 57 3 1
10: 123 57 4 0
11: 123 57 5 0
12: 123 57 6 1
Если вы хотите получить ожидаемый результат, который вы предоставили, вы можете сделать следующее.
setDT(foo)[, group := 1:.N][.(var1,
rep(var2, each = max(var3)),
rep(1:max(var3), times = nrow(foo)),
rep(group, each = max(var3))),
on = .(var1, var2, var3, group)][, `:=` (count = nafill(count, fill = 0),
group = NULL)][]
var1 var2 var3 count
1: 123 45 1 1
2: 123 45 2 0
3: 123 45 3 0
4: 123 45 4 0
5: 123 45 5 0
6: 123 45 6 0
7: 123 57 1 0
8: 123 57 2 0
9: 123 57 3 1
10: 123 57 4 0
11: 123 57 5 0
12: 123 57 6 0
13: 123 57 1 0
14: 123 57 2 0
15: 123 57 3 0
16: 123 57 4 0
17: 123 57 5 0
18: 123 57 6 1