【问题标题】:Handling missing values in time series replacing with previous values [duplicate]处理时间序列中的缺失值替换以前的值[重复]
【发布时间】:2019-07-04 09:25:34
【问题描述】:

我正在处理需要连续时间戳的时间序列数据,但在捕获时几乎没有丢失数据时间戳点,如下所示,

DF

ID Time_Stamp             A           B                 C
1  02/02/2018 07:45:00   123          567               434     
2   02/02/2018 07:45:01    
.....                  ...

5   02/02/2018 07:46:00   
6   02/02/2018 07:46:10    112          2323            2323

如上面的示例 df 所示,时间戳一直持续到第 5 行,但错过了在第 5 行和第 6 行之间捕获 10 秒的数据。我的数据框大约有 60000 行,手动识别缺失值很繁琐。因此,我一直在寻找使用 R

自动化处理缺失值的过程

我的结果数据框应该如下图,

ID Time_Stamp                     A          B          C
1  02/02/2018 07:45:00           123         567        434     
2   02/02/2018 07:45:01    
.....                  ...

5   02/02/2018 07:46:00         123         567         434
5.1  02/02/2018 07:46:01        123         567         434 
5.2  02/02/2018 07:46:02        123         567         434  
5.3  02/02/2018 07:46:03        123         567         434  
5.4  02/02/2018 07:46:04        123         567         434 
5.5  02/02/2018 07:46:05        123         567         434 
5.6  02/02/2018 07:46:06        123         567         434 
5.7  02/02/2018 07:46:07        123         567         434 
5.8  02/02/2018 07:46:08        123         567         434 
5.9  02/02/2018 07:46:09        123         567         434 
6   02/02/2018 07:46:10         112         2323        2323
6.1 02/02/2018 07:46:11         112         2323        2323 

即我在缺失值之前的最后一行。它是第 5 行的值,应该填充相同的值,直到下一个值可用。

我尝试使用以下代码将 0 添加为值。但不能对缺失值的前一行值做

df1<- df %>%
  complete(Timestamp = seq(min(Timestamp), max(Timestamp), by = "sec")) %>%
  mutate_at(vars(A:C), ~replace(., is.na(.), 0 )) %>%
  mutate(ID = row_number())

我得到如下输出:

ID Time_Stamp                     A        B        C
1  02/02/2018 07:45:00           123      567      434     
2   02/02/2018 07:45:01    
.....                  ...

5   02/02/2018 07:46:00         123       567      434
5.1  02/02/2018 07:46:01        0         0         0 
5.2  02/02/2018 07:46:02        0         0         0  
5.3  02/02/2018 07:46:03        0         0         0  
5.4  02/02/2018 07:46:04        0         0         0 
5.5  02/02/2018 07:46:05        0         0         0 
5.6  02/02/2018 07:46:06        0         0         0 
5.7  02/02/2018 07:46:07        0         0         0 
5.8  02/02/2018 07:46:08        0         0         0 
5.9  02/02/2018 07:46:09        0         0         0 
6   02/02/2018 07:46:10         112       2323      2323
6.1 02/02/2018 07:46:11         0         0         0 

我希望将上一行替换为 0 值。

提前致谢

【问题讨论】:

  • 不清楚。你能展示一下你的预期输出吗?
  • @RonakShah,嗨,我想要前一行数据值,即Row number 5 for all the missing values between 5 and 6,和row number 6 for value missing between 6 and 7。就像对于缺失值保持前一个值相同,即所有的 i = i-1` 值缺少行数据。
  • @RonakShah。我的意思是 0 值应该替换为第 5 行值。
  • 你需要df %&gt;% complete(Time_Stamp = seq(min(Time_Stamp), max(Time_Stamp), by = "sec")) %&gt;% fill(A, B, C) 吗?
  • 嗯..不确定。试试这个df %&gt;% complete(Time_Stamp = seq(min(Time_Stamp), max(Time_Stamp), by = "sec")) %&gt;% fill(everything())

标签: r time-series


【解决方案1】:

以下代码完美运行

 df1<- df %>%
      complete(Timestamp = seq(min(Timestamp), max(Timestamp), by = "sec")) %>%
      fill(everything()) %>%
      mutate(ID = row_number())

它在缺失数据时间开始之前将缺失数据与上一个或最后一个值相加。

【讨论】:

    【解决方案2】:

    使用xtx
    xts 包有一些处理缺失值的函数。您想要的称为 LOCF(Last Observation Carried Forward 的缩写)。 xtx 包具有用于此目的的 na.locf 函数。另请注意,您必须事先将数据转换为 xtx 对象。

    my_xts <- xts(df[3:5], order.by=df[2])
    newData <- na.locf(my_xts, na.rm = TRUE, fromLast = FALSE, maxgap=Inf)
    

    请注意,由于 xtx 对象是在矩阵类之上构建的,因此它期望所有列都属于同一类型(即在您的情况下,除时间戳之外的所有列都应该是数字。时间戳进入索引xtx 对象)。另外,请注意 Time_Stamp 的类型应该是日期/时间。

    更一般地
    通常,为了处理缺失值,您可以使用 forecast 包中的 na.interp() 函数。 na.interp() 用插值替换缺失值。它还可以插入季节性数据。
    正如其文档所引用的那样;

    默认情况下,对非季节性系列使用线性插值。对于季节性序列,首先计算稳健的 STL 分解。然后对经季节性调整的数据应用线性插值,并加回季节性分量。

    na.interp() 不能直接处理数据帧。您必须将数据转换为时间序列对象(ts 或 msts 对象)。

    library(forecast)
    my_msts <- df['A'] %>% 
     msts() %>%
     na.interp()
    

    使用 tidyr
    tidyr 包中的 fill 函数使这变得非常简单。在这种情况下,无需将数据转换为时间序列对象。
    来自 tidyr 文档:

    说明:
    使用上一个条目填充选定列中的缺失值。这在值不重复的通用输出格式中很有用,每次更改时都会记录它们。
    用法:
    填充(数据, ..., .direction = c("down", "up"))

    【讨论】:

      猜你喜欢
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      • 2020-12-13
      • 1970-01-01
      • 2019-08-06
      • 2015-12-18
      • 2020-10-23
      • 2021-03-07
      相关资源
      最近更新 更多