使用dplyr分组后查找缺少的月份

Kev*_*n M 3 r missing-data dplyr

我有一个数据框,有两列,我正在分组dplyr,一列数月(如数字,例如1到12),以及几个列后面有统计数据(值不重要).一个例子:

ID_1   ID_2   month  st1    st2
1      1      1      0.5    0.2
1      1      2      0.7    0.9
1      1      3      1.1    1.7
1      1      4      2.6    0.8
1      1      5      1.8    1.3
1      1      6      2.1    2.2
1      1      7      0.5    0.2
1      1      8      0.7    0.9
1      1      9      1.1    1.7
1      1      10     2.6    0.8
1      1      11     1.8    1.3
1      1      12     2.1    2.2
1      2      1      0.5    0.2
1      2      2      0.7    0.9
1      2      3      1.1    1.7
1      2      4      2.6    0.8
1      2      5      1.8    1.3
1      2      6      2.1    2.2
1      2      7      0.5    0.2
1      2      9      1.1    1.7
1      2      10     2.6    0.8
1      2      11     1.8    1.3
1      2      12     2.1    2.2
Run Code Online (Sandbox Code Playgroud)

对于第二个分组(ID_1 = 1和ID_2 = 2),数据(month = 8)中缺少一个月.有没有一种方法,我可以找到这个月并插入一个一行用正确的ID_1和ID_2值,遗漏month值,和NA值列的休息吗?我一直在玩这个使用dplyr功能,似乎无法弄明白,也许甚至还有一个非dplyr解决方案.

PS:如果它有帮助,每个独特的分组ID_1和ID_2将不会超过1个月失踪.

zx8*_*754 7

展开网格以组合所有组合,然后合并:

# make reference with all needed rows
ref <- data.frame(expand.grid(unique(df1$ID_1),
                              unique(df1$ID_2),
                              1:12))
colnames(ref) <- colnames(df1)[1:3]

# them merge with all TRUE
res <- merge(df1, ref, all = TRUE)

# to check output, show only month = 8
res[ res$month == 8, ]
#    ID_1 ID_2 month st1 st2
# 8     1    1     8 0.7 0.9
# 20    1    2     8  NA  NA
Run Code Online (Sandbox Code Playgroud)


aos*_*ith 6

这可以通过tidyr::complete以下方式完成:

library(dplyr)
library(tidyr)

dat %>% 
    group_by(ID_1, ID_2) %>%
    complete(month = 1:12)
Run Code Online (Sandbox Code Playgroud)

数据集尾:

Source: local data frame [6 x 5]
Groups: ID_1, ID_2 [1]

   ID_1  ID_2 month   st1   st2
  <int> <int> <int> <dbl> <dbl>
1     1     2     7   0.5   0.2
2     1     2     8    NA    NA
3     1     2     9   1.1   1.7
4     1     2    10   2.6   0.8
5     1     2    11   1.8   1.3
6     1     2    12   2.1   2.2
Run Code Online (Sandbox Code Playgroud)