在函数内部使用diff()产生错误,但不执行

问题描述 投票:0回答:1

我的可复制数据看起来像这样-

data <- rnorm(16)
timeStamp <- as.POSIXct("2019-03-18 10:30:00") + 0:15*60
Rf <- xts(x = data, order.by = timeStamp)
colnames(Rf) <- "R"

Rf[4:5]$R <- NA
Rf[8:9]$R <- NA
Rf[13:14]$R <- NA

omit.Rf <- na.omit(Rf)

我的目标是按时间顺序标记连续序列,并且以下代码起作用-

diff.omit.Rf <- diff(index(omit.Rf))
diff.omit.Rf <- append(1, diff.omit.Rf)
initNum <- 1
for (i in 1:length(omit.Rf)){
  if (diff.omit.Rf[[i]] == 1){
    omit.Rf$opNum[i] <- initNum
  } else {
    initNum <- initNum + 1
    omit.Rf$opNum[i] <- initNum
  }
}

我得到这个输出-

                     R              opNum
2019-03-18 10:30:00  0.89262137     1
2019-03-18 10:31:00  0.50428310     1
2019-03-18 10:32:00 -0.00040488     1
2019-03-18 10:35:00  0.10126335     2
2019-03-18 10:36:00  0.48726498     2
2019-03-18 10:39:00  1.05075049     3
2019-03-18 10:40:00 -0.25495699     3
2019-03-18 10:41:00  0.89257782     3
2019-03-18 10:44:00 -1.25474533     4
2019-03-18 10:45:00  0.55393767     4

[不幸的是,当我使用相同的代码创建函数时,它会警告我并且不执行该函数。

Error in diff.omit.Rf[[i]] : subscript out of bounds

我编写的函数的代码-

opTimeFun <- function(dataToDeal){
  diff.data <- diff(index(dataToDeal))
  diff.data <- append(1, diff.data)
  initNum <- 1
  for (i in 1:length(dataToDeal)){
    if (diff.data[[i]] == 1){
      dataToDeal$opNum[i] <- initNum
    } else {
      initNum <- initNum + 1
      dataToDeal$opNum[i] <- initNum
    }
  }
}

有人可以帮助解决这个问题吗?谢谢

r xts zoo
1个回答
0
投票

这里是没有for循环的较短版本,使用diffcumsum创建系列。

opTimeFun <- function(temp) {
   cumsum(c(TRUE, diff(index(temp)) > 1))
}

omit.Rf$opNum <- opTimeFun(omit.Rf)
omit.Rf

#                             R opNum
#2019-03-18 10:30:00 -0.1952424     1
#2019-03-18 10:31:00  0.8429390     1
#2019-03-18 10:32:00 -0.2429325     1
#2019-03-18 10:35:00  1.3471985     2
#2019-03-18 10:36:00 -0.7869906     2
#2019-03-18 10:39:00  0.5220991     3
#2019-03-18 10:40:00 -1.9884231     3
#2019-03-18 10:41:00 -1.8417666     3
#2019-03-18 10:44:00  1.5586149     4
#2019-03-18 10:45:00  3.5704500     4
© www.soinside.com 2019 - 2024. All rights reserved.