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

3

我有一个数据框,其中有两列。我使用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

对于第二组(ID_1 = 1ID_2 = 2),数据中缺少一个月份(month = 8)。有没有办法找到这个月份并插入一行,包括正确的ID_1ID_2值、缺失的month值以及其他列的NA值?我已经使用了dplyr函数进行尝试,但似乎无法解决问题,也许还有非dplyr的解决方案。

PS:如果有帮助的话,每个唯一的ID_1ID_2组合最多只会缺少1个月份。


对我来说你想要什么还不清楚。你真的想要一个全新的列来显示缺失月份的值吗?那其他月份的列的值会是什么,它们也会是NA吗? - Cyrus Mohammadian
我的帖子措辞有误,我已经编辑过了。我想插入一个新的,在缺失的月份处,该新行的列填充为NA(除了ID列)。 - Kevin M
3个回答

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

6
这可以通过 tidyr::complete 实现:
library(dplyr)
library(tidyr)

dat %>% 
    group_by(ID_1, ID_2) %>%
    complete(month = 1:12)

数据集的尾部:

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

3
如果你选择使用 tidyr,那么可以使用 complete 函数来实现此功能,如果你想将这两个变量作为分组变量,可以将它们嵌套在一起:ID_1ID_2
library(tidyr)
df1 = df %>% complete(nesting(ID_1, ID_2), month)

tail(df1)    
# Source: local data frame [6 x 5]

#    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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接