R lag / lead不规则时间序列数据

时间:2016-04-20 19:50:33

标签: r vectorization lag lead

我有不规则的时间序列数据框,其中包含time(秒)和value列。我想添加另一列value_2,其中值由delay秒引导。因此,value_2 t在时间value或之后t + delay等于ts=data.frame( time=c(1,2,3,5,8,10,11,15,20,23), value=c(1,2,3,4,5,6,7,8,9,10) ) ts_with_delayed_value <- add_delayed_value(ts, "value", 2, "time") > ts_with_delayed_value time value value_2 1 1 1 3 2 2 2 4 3 3 3 4 4 5 4 5 5 8 5 6 6 10 6 8 7 11 7 8 8 15 8 9 9 20 9 10 10 23 10 10

add_delayed_value

我有自己的这个函数版本add_delayed_value <- function(data, colname, delay, colname_time) { colname_delayed <- paste(colname, sprintf("%d", delay), sep="_") data[colname_delayed] <- NaN for (i in 1:nrow(data)) { time_delayed <- data[i, colname_time] + delay value_delayed <- data[data[colname_time] >= time_delayed, colname][1] if (is.na(value_delayed)) { value_delayed <- data[i, colname] } data[i, colname_delayed] <- value_delayed } return(data) } ,这里是:

$ curl -G "$MASTER/api/v1/namespaces/$NAMESPACE/pods?labelSelector=$KEY=$VALUE"

有没有办法对这个例程进行矢量化以避免慢速循环?

我对R很新,所以这段代码可能有很多问题。有什么可以改进的?

4 个答案:

答案 0 :(得分:2)

你可以尝试:

library(dplyr)
library(zoo)
na.locf(ts$value[sapply(ts$time, function(x) min(which(ts$time - x >=2 )))])
[1]  3  4  4  5  6  8  8  9 10 10

答案 1 :(得分:0)

你想要的不清楚,给出一个伪代码或一个公式。看起来这就是你想要的...... 根据我的理解,你的最后一个值应该是NA

library(data.table)
setDT(ts,key='time')
ts_delayed = ts[,.(time_delayed=time+2)]
setkey(ts_delayed,time_delayed)
ts[ts_delayed,roll=-Inf]

答案 2 :(得分:0)

这应该适用于您的数据。如果你想做一个普通的功能,你将不得不玩lazyeval,老实说这可能不值得。

library(dplyr)
library(zoo)

carry_back = . %>% na.locf(na.rm = TRUE, fromLast = FALSE)


data_frame(time = 
             with(ts, 
                  seq(first(time), 
                      last(time) ) ) ) %>%
  left_join(ts) %>%
  transmute(value_2 = carry_back(value),
            time = time - delay) %>%
  right_join(ts) %>%
  mutate(value_2 = 
           value_2 %>%
           is.na %>%
           ifelse(last(value), value_2) )

答案 3 :(得分:0)

collapse::flag 支持不规则时间序列和面板的快速滞后,另见我的回答 here。要获得准确的结果,您必须使用 flag 等函数填充 data.table::nafill 引入的缺失值,并带有选项 "locf"。与之前的建议相比,这两个函数的组合可能是最简洁、最有效的解决方案。