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
一个dplyr
和tidyr
的可能性是:
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
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
一个dplyr
和tidyr
的可能性是:
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()
.
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