【问题标题】:Filling the gap in the time series填补时间序列的空白
【发布时间】:2019-05-14 11:58:50
【问题描述】:

我有以下数据,

id <- c(rep(12, 10), rep(14, 12), rep(16, 2))
m <- c(seq(1:5), seq(8,12), seq(1:12), 10, 12)
y <- c(rep(14, 10), rep(14, 12), rep(15, 2))
v <- rnorm(24)
df <- data.frame(id, m, y, v)
> df
   id  m  y          v
1  12  1 14  0.9453216
2  12  2 14  1.0666393
3  12  3 14 -0.2750527
4  12  4 14  1.3264349
5  12  5 14 -1.8046676
6  12  8 14  0.3334960
7  12  9 14 -1.2448408
8  12 10 14  0.5258248
9  12 11 14 -0.1233157
10 12 12 14  1.4717530
11 14  1 14  0.6217376
12 14  2 14 -0.8344823
13 14  3 14  1.1468841
14 14  4 14 -0.3363987
15 14  5 14 -1.3543311
16 14  6 14 -0.2146853
17 14  7 14 -0.6546186
18 14  8 14 -2.4286257
19 14  9 14 -1.3314888
20 14 10 14  0.8215581
21 14 11 14 -0.9999368
22 14 12 14 -1.2935147
23 16 10 15  0.7339261
24 16 12 15  1.1303524

第一列是id,第二列m是月份,第三列y是年份,最后一列是值。

在月份列中,第 14 年缺少两个观测值(6 月和 7 月),而第 15 年则缺少 11 月。

我希望那些缺失的月份的值为零。这意味着,例如,对于第 15 年,数据应如下所示,

16 10 15    0.7339261
16 11 15    0
16 12 15    1.1303524

任何人都可以提出一种方法来做到这一点?

【问题讨论】:

    标签: r data.table tidyverse


    【解决方案1】:

    或者在data.table 中,为每个id 和year 生成月份,将其与id、y、m 上的原始数据集连接起来,然后将NAs 替换为0:

    library(data.table)
    setDT(df)
    
    df[df[, .(m=min(m):max(m)), by=.(id, y)], on=.(id,y,m)][
        is.na(v), v := 0]
    

    【讨论】:

      【解决方案2】:

      使用dplyrtidyr,您可以:

      df %>%
       group_by(id) %>%
       complete(m = seq(min(m), max(m), 1), fill = list(v = 0)) %>%
       fill(y)
      
            id     m     y        v
         <dbl> <dbl> <dbl>    <dbl>
       1    12     1    14  0.539  
       2    12     2    14 -0.0768 
       3    12     3    14  1.85   
       4    12     4    14 -0.855  
       5    12     5    14  0.0326 
       6    12     6    14  0      
       7    12     7    14  0      
       8    12     8    14 -1.03   
       9    12     9    14 -0.982  
      10    12    10    14  0.00410
      11    12    11    14 -0.233  
      12    12    12    14 -0.499  
      13    14     1    14  1.55   
      14    14     2    14  0.0875 
      15    14     3    14  1.32   
      16    14     4    14 -0.981  
      17    14     5    14 -0.246  
      18    14     6    14 -1.40   
      19    14     7    14  1.44   
      20    14     8    14 -0.981  
      21    14     9    14  1.47   
      22    14    10    14 -0.991  
      23    14    11    14 -0.0945 
      24    14    12    14 -2.88   
      25    16    10    15 -0.247  
      26    16    11    15  0      
      27    16    12    15  0.0147 
      

      【讨论】:

      • 谢谢。我不希望 10 月之前的第 15 年有任何数据点。你的解决方案是给我一月份的数据点。这意味着观察的总数应该是 27,而不是 36。
      • 另外,我在y 列中看到零。应该是对应的年份。
      • 所以您对每个 ID 有 12 个月不感兴趣?我想你想要每个 ID 的最小和最大月份之间的所有月份?
      • 没有。这就是我在示例中写 15 年部分的原因。
      猜你喜欢
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      相关资源
      最近更新 更多