foo <- data.frame("var1"=c(123,123,123),"var2"=c(45,57,57),"var3"=c(1,3,6),"count"=c(1,1,1))
  var1 var2 var3 count
1  123   45    1     1
2  123   57    3     1
3  123   57    6     1

Quiero completar var3 con números del 1 al 6 por cada obs en var2 , retener los datos del marco de datos original y contar como 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     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 
2
Mar 19 feb. 2020 a las 16:11

2 respuestas

La mejor respuesta

Una posibilidad dplyr y tidyr podría ser:

foo %>%
 rowid_to_column() %>%
 complete(var3 = seq(min(var3), max(var3), 1), nesting(rowid), fill = list(count = 0)) %>%
 arrange(rowid) %>%
 group_by(rowid) %>%
 fill(var1, var2, .direction = "updown") 

    var3 rowid  var1  var2 count
   <dbl> <int> <dbl> <dbl> <dbl>
 1     1     1   123    45     1
 2     2     1   123    45     0
 3     3     1   123    45     0
 4     4     1   123    45     0
 5     5     1   123    45     0
 6     6     1   123    45     0
 7     1     2   123    57     0
 8     2     2   123    57     0
 9     3     2   123    57     1
10     4     2   123    57     0
11     5     2   123    57     0
12     6     2   123    57     0
13     1     3   123    57     0
14     2     3   123    57     0
15     3     3   123    57     0
16     4     3   123    57     0
17     5     3   123    57     0
18     6     3   123    57     1
1
tmfmnk 19 feb. 2020 a las 13:21

Esta pregunta ya está hecha. Pero quiero dejar otro camino usando data.table para ti. Leí tu comentario arriba. Por lo tanto, mi salida es diferente de la de tmfmnk. Aquí utilicé subconjuntos como uniones. Básicamente estoy creando todas las combinaciones posibles de var1, var2 y var3. Las longitudes de var2 y var3 (var3 tiene 1: 6 para cada valor de var2) están organizadas de manera que sus longitudes coincidan. Después de esto, reemplacé NAs con 0 usando 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

Si desea obtener el resultado esperado que proporcionó, puede hacer lo siguiente.

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
2
jazzurro 19 feb. 2020 a las 16:32