R按顺序插入行

R insert rows with sequence

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

我想为var2中的每个obs填充1到6的数字var3,保留原始数据帧中的数据,计数为 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 

一个dplyrtidyr的可能性是:

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

这题已经做完了。但我想为您留下另一种使用 data.table 的方式。我看了你上面的评论。因此我的输出与 tmfmnk 的不同。在这里我使用子集作为连接。我基本上是在创建 var1、var2 和 var3 的所有可能组合。 var2 和 var3 的长度(对于 var2 的每个值,var3 都有 1:6)排列成它们的长度匹配。在此之后,我使用 nafill().

将 NA 替换为 0
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