我目前已经查看了imputeTS和zoo包,但它看不到当前数据是..
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,这样时间就是前后行的中点。另外,我必须指出,每个时间序列都属于一个组。这意味着每个组的时间都会重置。
为了更清楚,我将提供实际数据的图片

提前感谢您的帮助!
发布于 2017-11-30 23:40:23
zoo包中的na.approx可以做到这一点,并且可以使用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)编写函数强制向量到zoo对象,插值NAs,提取结果
library(zoo)
foo <- function(x) coredata(na.approx(zoo(x), na.rm = FALSE))在基数R中使用tapply将foo应用于每个组的示例
df2 <- df #make a copy
df2$timeseries <- do.call(c, tapply(df2$timeseries, INDEX = df2$group, foo))在data.table中使用group by将foo应用于每个组的示例
library(data.table)
DT <- data.table(df)
DT[, timeseries := foo(timeseries), by = "group"]发布于 2017-12-02 09:18:19
imputeTS和zoo不接受字符或时间戳作为其插值函数的输入。(通常插入字符没有意义)
但是您可以将字符作为输入输入到zoo的na.locf函数中。(使用此函数将结转最后一个观察值)
您的任务的最佳解决方案应该如下所示(我假设您提供的日期为POSIX.ct)
# 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")第一行中的"input“是带有POSIX.ct时间戳的向量。第二行中的原点和tz (时区)设置必须根据时间戳进行设置。
https://stackoverflow.com/questions/47574929
复制相似问题