处理时间序列中的缺失值

3
我正在处理时间序列数据,需要连续的时间戳,但在捕获过程中,一些数据时间戳点被遗漏了,例如下面这样: 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         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

请帮忙!


看一下 mice/zoo。无论如何,mean(A) 是什么意思都不清楚。你是用平均值替换所有缺失值吗?你只是说 处理缺失值,但有几种填补方法具有不同的用途。 - NelsonGon
1
@NelsonGon,是的,我正在尝试用该列的平均值替换缺失的行。我尝试了搜索插补方法,大多数方法都是针对如何处理NA的情况。而我需要创建在跳过时间间隔之间带有NA的行,稍后用平均值替换NA不是问题。 - user11497093
2个回答

2
最好提供一个具体的例子,展示具体的输出结果,这样就不会有歧义和假设。但是,根据我的理解,我创建了一些虚拟数据,并尝试相应地解决它。
如果我理解正确,你有时间序列数据,每秒钟有一个数据点,但有时会缺少几秒钟的数据,你想用该列的平均值来填充它。
我们可以使用“complete”通过在“Time_Stamp”的“min”和“max”之间为每秒生成一个序列,并通过相应列中的“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 

data

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

嗨,感谢您提供的解决方案。当我运行您的脚本时,它显示“Error in seq.default(min(Timestamp), max(Timestamp), by = "sec") : 'from' must be a finite number”。Str(df) 显示 TimeStamp 是“chr”。这是类型转换的问题吗? - user11497093
@RahulK 是的,你需要将它们从字符转换为日期时间。首先执行 df$Timestamp <- as.POSIXct(df$Timestamp, format = "%d/%m/%Y %T"),然后应用上述代码。 - Ronak Shah

0

关于您的问题,有几件事情需要说:

  • 从科学角度而言,是否有动机用平均值替换具有含义的缺失值?
  • 从技术角度而言,可以使用*apply()函数(例如,lapply非常适合数据框)来实现。
  • 关于R社区,这可能是一个经常出现的问题。您是否在其他地方检查过一些帖子?比如 thisthat,这些都可能会有所帮助或给出提示。我希望我的回答能对您有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接