处理时间序列中的缺失值,用先前的值替换

时间:2019-07-04 09:25:34

标签: r time-series

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

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值。

预先感谢

2 个答案:

答案 0 :(得分:1)

使用xtx
xts程序包具有一些用于处理缺失值的功能。您想要的就是LOCF(“上一个观察结转”的缩写)。 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的类型应为日期/时间。

更普遍
通常,要处理缺失值,可以使用na.interp()包中的forecast函数。 na.interp()用内插值替换丢失的值。而且还可以插值季节性数据。
正如其文档中引用的那样;

  

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

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

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

使用提迪尔
fill软件包中的tidyr函数使此操作非常简单。在这种情况下,无需将数据转换为时间序列对象。
从提迪尔文档中:

  

说明:
  使用上一个条目填充所选列中的缺失值。这在通用输出格式中很有用,在通用输出格式中,值不会重复,每次更改都会记录下来。
  用法:
  fill(data,...,.direction = c(“ down”,“ up”))

答案 1 :(得分:0)

以下代码可完美运行

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

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