r列中缺失值时间序列的插值
我目前已经看过了IMPUTET和动物园的软件包,但它似乎不起作用 当前数据为r列中缺失值时间序列的插值,r,time-series,interpolation,zoo,imputets,R,Time Series,Interpolation,Zoo,Imputets,我目前已经看过了IMPUTET和动物园的软件包,但它似乎不起作用 当前数据为 group/timeseries(character) 1 2017-05-17 04:00:00 1 2017-05-17 04:01:00 1 NA 1 NA 1 2017-05-17 05:00:00 1 2017-05-17 06:00:00 2 NA 2 2017-05-17 04:31:00
group/timeseries(character)
1 2017-05-17 04:00:00
1 2017-05-17 04:01:00
1 NA
1 NA
1 2017-05-17 05:00:00
1 2017-05-17 06:00:00
2 NA
2 2017-05-17 04:31:00
2 NA
2 NA
2 NA
2 2017-05-17 05:31:00
我想用插值时间序列填充NA,这样时间就是前后行的中点。此外,我必须指出,每个时间序列都属于一个组。表示每组的时间重置
我将提供一个更清晰的实际数据图片
提前谢谢你的帮助
na.zoo包中的近似值
可以做到这一点,并且可以使用base中的tapply
或data.table中的分组操作来处理分组,而无需循环
对于您的数据集
df <- read.table(text=c("
group timeseries
1 '2017-05-17 04:00:00'
1 '2017-05-17 04:01:00'
1 NA
1 NA
1 '2017-05-17 05:00:00'
1 '2017-05-17 06:00:00'
2 NA
2 '2017-05-17 04:31:00'
2 NA
2 NA
2 NA
2 '2017-05-17 05:31:00'
"),
colClasses = c("integer", "POSIXct"),
header = TRUE)
dfinputets和zoo不将字符或时间戳作为其插值函数的输入。(通常插入字符没有意义)
但是,您可以为zoo的na.locf函数输入字符。
(最后一次观察与此功能一起结转)
对于您的任务,最好的解决方案应该是
(我假设您的日期为POSIX.ct)
#对数字输入执行插补
temp当您说“因此时间是前后行的中点”时,当两个有效时间戳之间有多条丢失记录时,是否希望出现这种行为?还是要在未观测到的间隔内进行线性插值(等距)?在多个缺失记录之间进行等距插值,因此如果有2-na-na-na-10,则应为2-4-6-8-10。zoo的na.locf可以“插值”向前或向后携带最后一个值的字符数据。
library(zoo)
foo <- function(x) coredata(na.approx(zoo(x), na.rm = FALSE))
df2 <- df #make a copy
df2$timeseries <- do.call(c, tapply(df2$timeseries, INDEX = df2$group, foo))
library(data.table)
DT <- data.table(df)
DT[, timeseries := foo(timeseries), by = "group"]
# Perform the imputation on numeric input
temp <- imputeTS::na.interpolation( as.numeric ( input ) )
# Transform the numeric values back to dates
as.POSIXct(temp, origin = "1960-01-01", tz = "UTC")