【问题标题】:How to fill in missing dates by minute by group in R如何在R中按组按分钟填写缺失的日期
【发布时间】:2019-05-17 13:51:18
【问题描述】:

我正在尝试从具有不同组的数据框中填充缺失的分钟数。我希望用零填充缺失的分钟数。

我尝试使用此R - Fill missing dates by group,但找不到填补缺失分钟数的方法。

Datetime            | Group | Value |
2019-01-01 00:00:00 |  1    |  5    |
2019-01-01 00:00:00 |  2    |  4    |
2019-01-01 00:00:00 |  3    |  2    | 
2019-01-01 00:01:00 |  1    |  1    |
2019-01-01 00:02:00 |  1    |  2    | 
2019-01-01 00:02:00 |  2    |  2    |
2019-01-01 00:02:00 |  3    |  1    |
2019-01-01 00:03:00 |  1    |  1    |
2019-01-01 00:03:00 |  2    |  2    |
2019-01-01 00:04:00 |  1    |  1    |

我希望决赛桌看起来像这样 -

Datetime            | Group | Value |
2019-01-01 00:00:00 |  1    |  5    |
2019-01-01 00:00:00 |  2    |  4    |
2019-01-01 00:00:00 |  3    |  2    | 
2019-01-01 00:01:00 |  1    |  1    |
2019-01-01 00:01:00 |  2    |  0    | 
2019-01-01 00:01:00 |  3    |  0    |
2019-01-01 00:02:00 |  1    |  2    |
2019-01-01 00:02:00 |  2    |  2    |
2019-01-01 00:02:00 |  3    |  1    |
2019-01-01 00:03:00 |  1    |  1    |
2019-01-01 00:03:00 |  2    |  2    |
2019-01-01 00:03:00 |  3    |  0    |
2019-01-01 00:04:00 |  1    |  1    |
2019-01-01 00:04:00 |  2    |  0    |
2019-01-01 00:04:00 |  3    |  0    |

【问题讨论】:

  • 您希望基于此的最终结果是什么样的?

标签: r date fill minute


【解决方案1】:
library(dplyr); library(padr)
df %>%
  pad(group = 'Group', interval = 'min') %>%   # Explicitly fill by 1 min
  fill_by_value(Value)

#pad applied on the interval: min
#              Datetime Group Value
#1  2019-01-01 00:00:00     1     5
#2  2019-01-01 00:01:00     1     1
#3  2019-01-01 00:02:00     1     2
#4  2019-01-01 00:03:00     1     1
#5  2019-01-01 00:04:00     1     1
#6  2019-01-01 00:00:00     2     4
#7  2019-01-01 00:01:00     2     0    # added
#8  2019-01-01 00:02:00     2     2
#9  2019-01-01 00:03:00     2     2
#10 2019-01-01 00:00:00     3     2
#11 2019-01-01 00:01:00     3     0    # added
#12 2019-01-01 00:02:00     3     1

数据

df <- read.table(
  header = T,
  stringsAsFactors = F, sep = "|",
  text = "Datetime            | Group | Value
2019-01-01 00:00:00 |  1    |  5  
2019-01-01 00:00:00 |  2    |  4    
2019-01-01 00:00:00 |  3    |  2     
2019-01-01 00:01:00 |  1    |  1  
2019-01-01 00:02:00 |  1    |  2     
2019-01-01 00:02:00 |  2    |  2    
2019-01-01 00:02:00 |  3    |  1    
2019-01-01 00:03:00 |  1    |  1    
2019-01-01 00:03:00 |  2    |  2    
2019-01-01 00:04:00 |  1    |  1"
) 
df$Datetime = lubridate::ymd_hms(df$Datetime)

【讨论】:

  • 从第一个日期开始有效,但是如果有一些情况下,组在第 5 分钟之前没有值,那么它之前不会填充。
  • 好的,那么你可以指定'min'的间隔 -- 上面编辑过。
【解决方案2】:

使用base

date_groups <- expand.grid(Datetime= seq(min(df$Datetime), max(df$Datetime), "min"), 
                           Group = c(1:3))

date_groups <- merge(date_groups, df, all.x = TRUE)
date_groups[is.na(date_groups)] <- 0

【讨论】:

    【解决方案3】:

    我们可以使用complete

    library(tidyverse)
    df %>%
       complete(Group, Datetime = seq(min(Datetime),
              max(Datetime), by = "1 min"), fill = list(Value = 0)) %>% 
       arrange(Datetime)  %>% 
       select(names(df))
    # A tibble: 15 x 3
    #   Datetime            Group Value
    #   <dttm>              <dbl> <dbl>
    # 1 2019-01-01 00:00:00     1     5
    # 2 2019-01-01 00:00:00     2     4
    # 3 2019-01-01 00:00:00     3     2
    # 4 2019-01-01 00:01:00     1     1
    # 5 2019-01-01 00:01:00     2     0
    # 6 2019-01-01 00:01:00     3     0
    # 7 2019-01-01 00:02:00     1     2
    # 8 2019-01-01 00:02:00     2     2
    # 9 2019-01-01 00:02:00     3     1
    #10 2019-01-01 00:03:00     1     1
    #11 2019-01-01 00:03:00     2     2
    #12 2019-01-01 00:03:00     3     0
    #13 2019-01-01 00:04:00     1     1
    #14 2019-01-01 00:04:00     2     0
    #15 2019-01-01 00:04:00     3     0
    

    数据

    df <- structure(list(Datetime = structure(c(1546300800, 1546300800, 
    1546300800, 1546300860, 1546300920, 1546300920, 1546300920, 1546300980, 
    1546300980, 1546301040), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
        Group = c(1, 2, 3, 1, 1, 2, 3, 1, 2, 1), Value = c(5, 4, 
        2, 1, 2, 2, 1, 1, 2, 1)), row.names = c(NA, -10L), class = "data.frame")
    

    【讨论】:

      猜你喜欢
      • 2020-05-07
      • 2018-07-15
      • 2020-11-10
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多