r列中缺失值时间序列的插值

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

我目前已经看过了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
  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")