1

time(秒)と列を持つ不規則な時系列データ フレームがありvalueます。value_2値がdelay秒単位で進む別の列を追加したいと思います。そのためvalue_2、時刻はその時刻またはその直後tと同じです。valuet + 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)
}

このルーチンをベクトル化して低速ループを回避する方法はありますか?

私は R にまったく慣れていないので、このコードにはおそらく多くの問題があります。それについて何を改善できますか?

4

4 に答える 4

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
于 2016-04-20T19:59:07.427 に答える
1

あなたが望むものは明確ではありません。疑似コードまたは式を与えてください。これはあなたが望むもののようです...私があなたから理解していることから、最後の値は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]
于 2016-04-20T20:46:23.410 に答える
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) )
于 2016-04-20T20:56:39.970 に答える