R-按组的最大值在序列中插入缺失的数字

时间:2019-03-08 06:48:27

标签: r

我想按照以下两个条件在索引列中插入缺失的数字:

  1. 由多列分区
  2. 最小值始终为1
  3. 最大值始终是组和类型的最大值

当前数据:

group   type    index   vol
A       1       1       200
A       1       2       244
A       1       5       33

A       2       2       66
A       2       3       2
A       2       4       199
A       2       10      319

B       1       4       290
B       1       5       188
B       1       6       573
B       1       9       122

所需数据:

group   type    index   vol
A       1       1       200
A       1       2       244
A       1       3       0
A       1       4       0
A       1       5       33

A       2       1       0
A       2       2       66
A       2       3       2
A       2       4       199
A       2       5       0
A       2       6       0
A       2       7       0
A       2       8       0
A       2       9       0
A       2       10      319

B       1       1       0
B       1       2       0
B       1       3       0
B       1       4       290
B       1       5       188
B       1       6       573
B       1       7       0
B       1       8       0
B       1       9       122

为清楚起见,我刚刚在分区之间添加了空格。

希望您能帮上忙!

2 个答案:

答案 0 :(得分:2)

您可以执行以下操作

library(dplyr)
library(tidyr)

my_df %>% 
  group_by(group, type) %>% 
  complete(index = 1:max(index), fill = list(vol = 0))

#    group type index vol
# 1      A    1     1 200
# 2      A    1     2 244
# 3      A    1     3   0
# 4      A    1     4   0
# 5      A    1     5  33
# 6      A    2     1   0
# 7      A    2     2  66
# 8      A    2     3   2
# 9      A    2     4 199
# 10     A    2     5   0
# 11     A    2     6   0
# 12     A    2     7   0
# 13     A    2     8   0
# 14     A    2     9   0
# 15     A    2    10 319
# 16     B    1     1   0
# 17     B    1     2   0
# 18     B    1     3   0
# 19     B    1     4 290
# 20     B    1     5 188
# 21     B    1     6 573
# 22     B    1     7   0
# 23     B    1     8   0
# 24     B    1     9 122

使用group_by,指定您指定的带有空白的组。使用complete,您可以指定应填写的列,然后为其余列填写哪些值(默认为NA

数据

my_df <- 
  structure(list(group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("A", "B"), class = "factor"), 
                 type = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L), 
                 index = c(1L, 2L, 5L, 2L, 3L, 4L, 10L, 4L, 5L, 6L, 9L), 
                 vol = c(200L, 244L, 33L, 66L, 2L, 199L, 319L, 290L, 188L, 573L, 122L)), 
            class = "data.frame", row.names = c(NA, -11L))

答案 1 :(得分:1)

一种dplyrtidyr的可能性是:

df %>%
 group_by(group, type) %>%
 complete(index = full_seq(1:max(index), 1), fill = list(vol = 0))

   group  type index   vol
   <fct> <int> <dbl> <dbl>
 1 A         1     1   200
 2 A         1     2   244
 3 A         1     3     0
 4 A         1     4     0
 5 A         1     5    33
 6 A         2     1     0
 7 A         2     2    66
 8 A         2     3     2
 9 A         2     4   199
10 A         2     5     0
11 A         2     6     0
12 A         2     7     0
13 A         2     8     0
14 A         2     9     0
15 A         2    10   319
16 B         1     1     0
17 B         1     2     0
18 B         1     3     0
19 B         1     4   290
20 B         1     5   188
21 B         1     6   573
22 B         1     7     0
23 B         1     8     0
24 B         1     9   122