r - 处理时间序列中的缺失值

标签 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 行 但错过了 之间 10 秒 的数据捕获第 5 和第 6 行。我的数据框大约有 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         mean(A)
5.1  02/02/2018 07:46:01        mean(A)     mean(b)         mean(c)
5.2  02/02/2018 07:46:02        mean(A)     mean(b)         mean(c) 
5.3  02/02/2018 07:46:03        mean(A)     mean(b)         mean(c) 
5.4  02/02/2018 07:46:04        mean(A)     mean(b)         mean(c)
5.5  02/02/2018 07:46:05        mean(A)     mean(b)         mean(c)
5.6  02/02/2018 07:46:06        mean(A)     mean(b)         mean(c)
5.7  02/02/2018 07:46:07        mean(A)     mean(b)         mean(c)
5.8  02/02/2018 07:46:08        mean(A)     mean(b)         mean(c)
5.9  02/02/2018 07:46:09        mean(A)     mean(b)         mean(c)
6   02/02/2018 07:46:10         112         2323            2323

请帮忙!

最佳答案

最好有一个具体的例子来显示具体的预期输出,这样就没有歧义和假设的空间了。但是,我根据自己的理解创建了一个虚拟数据,并尝试相应地解决它。

如果我没理解错的话,你有时间序列数据,每秒都有数据点,但有时会丢失一些秒数,你想用该列的 mean 填充它。

我们可以使用 complete 通过在 minmax Time_Stamp 之间的每一秒生成一个序列来实现这一点并用相应列中的 mean 填充缺失值。 ID 看起来像是每一行的唯一标识符,所以用 row_number() 填充它。

library(dplyr)
library(tidyr)

df %>%
  complete(Time_Stamp = seq(min(Time_Stamp), max(Time_Stamp), by = "sec")) %>%
  mutate_at(vars(A:C), ~replace(., is.na(.), mean(., na.rm = TRUE))) %>%
  mutate(ID = row_number()) 


# A tibble: 11 x 5
#   Time_Stamp             ID     A     B     C
#   <dttm>              <int> <dbl> <dbl> <dbl>
# 1 2018-02-02 07:45:00     1  123   567   434 
# 2 2018-02-02 07:45:01     2  234   100   110 
# 3 2018-02-02 07:45:02     3  234   100   110 
# 4 2018-02-02 07:45:03     4  176.  772.  744.
# 5 2018-02-02 07:45:04     5  176.  772.  744.
# 6 2018-02-02 07:45:05     6  176.  772.  744.
# 7 2018-02-02 07:45:06     7  176.  772.  744.
# 8 2018-02-02 07:45:07     8  176.  772.  744.
# 9 2018-02-02 07:45:08     9  176.  772.  744.
#10 2018-02-02 07:45:09    10  176.  772.  744.
#11 2018-02-02 07:45:10    11  112  2323  2323 

如果您检查最后 3 列的列均值,您可以看到这些值已被准确替换。

colMeans(df[3:5])
#     A      B      C 
#175.75 772.50 744.25 

数据

df <- structure(list(ID = 1:4, Time_Stamp = structure(c(1517557500, 
1517557501, 1517557502, 1517557510), class = c("POSIXct", "POSIXt"
), tzone = "UTC"), A = c(123L, 234L, 234L, 112L), B = c(567L, 
100L, 100L, 2323L), C = c(434L, 110L, 110L, 2323L)), class = "data.frame", 
row.names = c(NA, -4L))

看起来像

df

#  ID          Time_Stamp   A    B    C
#1  1 2018-02-02 07:45:00 123  567  434
#2  2 2018-02-02 07:45:01 234  100  110
#3  3 2018-02-02 07:45:02 234  100  110
#4  4 2018-02-02 07:45:10 112 2323 2323

关于r - 处理时间序列中的缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56125885/

相关文章:

r - 如何在 R 中进行分类时间序列预测?

r - 在 R 中制作这个无花果

r - 计算数据框中两个长纬度坐标之间的距离

R:使用 ggplot2 绘制带有分位数的时间序列

r - 时间序列预测,处理已知的大订单

python - Pandas - 根据混合频率的数据计算月平均值

python - 根据年份和儒略日在 pandas 中创建日期时间

r - 过滤R中包含字符和数字的特定范围值中的行

r - 在 knitr 中缓存子文件

使用嵌套因子删除条形图中每个面板未使用的因子