【问题标题】:Find missing month after grouping with dplyr使用 dplyr 分组后查找缺失的月份
【发布时间】:2017-01-24 00:54:14
【问题描述】:

我有一个数据框,其中包含两列,我用 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)。有没有办法我可以在这个月找到并插入一个 row,其中包含正确的 ID_1ID_2 值、缺少的 month 值以及其余列的 NA 值?我一直在使用dplyr 函数来解决这个问题,但似乎无法弄清楚,也许甚至还有一个非dplyr 的解决方案。

PS:如果有帮助,ID_1ID_2 的每个唯一分组将丢失不超过 1 个月。

【问题讨论】:

  • 我不清楚您在寻找什么。您真的想要一个全新的列来显示缺失月份的值吗?其他月份没有丢失的列的其他值是什么?它们会是 NA 吗?
  • 我的帖子中的措辞已关闭,我已对其进行了编辑。我想在缺少月份的地方插入一个新的 ,该新行的列填充有NA(除了 ID 列)。

标签: r dplyr missing-data


【解决方案1】:

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

# 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

【讨论】:

    【解决方案2】:

    如果您使用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
    

    【讨论】:

      【解决方案3】:

      这可以通过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
      

      【讨论】:

        猜你喜欢
        • 2022-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-29
        • 2011-08-21
        • 2015-06-04
        • 1970-01-01
        相关资源
        最近更新 更多