我正在处理时间序列数据,我需要有连续的时间戳,但是在捕获数据时几乎没有丢失数据时间戳记点,如下所示,
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值。
预先感谢
答案 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())
它会在开始丢失数据时间之前,将丢失的数据与上一个或最后一个值相加。