简单循环导致内存溢出(base R)

Simple loop leads to memory overflow (base R)

我正在用一个非常简单的循环交换我的记忆,但我看不到问题所在。我正在开发一种工具来清理 10 分钟时间步长的时间序列。它可能有时间步长间隙、双时间步长和不规则的 10 分钟间隔时间步长。我的方法是先生成 "clean" 时间序列,然后匹配 "good" 时间步长。之后,我想检查不正常的 10 分钟间隔时间步长。这就是问题出现的地方。抱歉,代码很长:

测试数据生成:

rm(list = ls())
Sys.setenv(TZ="Europe/Berlin")
Sys.timezone()
DATE = seq( as.POSIXct("2015-03-28 00:00:00", tz="Europe/Berlin"),
            as.POSIXct("2015-04-26 23:00:00", tz="Europe/Berlin"), by = 600)
V1 = round(2*runif(length(DATE)), 2)
DF <- data.frame(DATE, V1)

添加一些 "bad" 数据:

DF2 <- data.frame(DATE= as.POSIXct(c("2015-04-05 05:00:00", 
                                     "2015-04-05 05:00:00", 
                                     "2015-04-10 10:00:00", 
                                     "2015-04-15 15:15:00", 
                                     "2015-04-20 20:02:00", 
                                     "2015-04-26 23:07:00",
                                     "2015-04-26 23:17:00",
                                     "2015-04-26 23:27:00",
                                     "2015-04-26 23:37:00")),
                  V1 = c("0.77", 
                         "0.77", 
                         "0.77", 
                         "0.77", 
                         "0.77", 
                         "0.77", 
                         "0.77", 
                         "0.77", 
                         "0.77"))
DF <- rbind(DF, DF2)
DF <- DF[ order(DF$DATE), ]

定义一些时间变量和最终的 "clean" 时间序列:

START_DATE    <- as.POSIXct("2015-03-28 00:00:00", tz="Europe/Berlin") 
END_DATE      <- as.POSIXct("2015-04-26 23:40:00", tz="Europe/Berlin")
tdiff         <- difftime("2015-03-28 00:10:00", "2015-03-28 00:00:00", 
                   tz="Europe/Berlin", units = "mins")
DT            <- seq( START_DATE, END_DATE, by = 600)
DF_clean      <- DF[match(DT,DF$DATE), ]

这么长,如您所见,DF_clean 看起来已经很不错了,但最后 4 行是 NA,因为时间步长超出了常规的 10 分钟间隔。所以我需要查看这些时间步长之间是否有任何数据,并将它们移动到正确的 10 分钟间隔。

for (var in DT[ which( is.na(DF_clean$DATE))]) {
  has.value <- DF$DATE > as.POSIXct(var, origin="1970-01-01") - tdiff & 
               DF$DATE < as.POSIXct(var, origin="1970-01-01")
  DF_clean[as.POSIXct(var, origin="1970-01-01"), ] <- DF[ has.value, ]
}

如果我 运行 使用 var <- "2015-04-26 23:10:00 CEST" 手动输入 for 循环的内容,它就可以工作。 运行 整个循环导致交换内存。我认为这与在循环内和 [] 内使用 POSIXct 有关,但我不知道如何使用 - tdiff

我还没有尝试过任何软件包,因为我实际上对 base R 解决方案很感兴趣,在我不真正了解 base R 之前,我被吸引来避免这里的任何软件包。;)

是你要找的吗:

for (ind in which(is.na(DF_clean$DATE))) {
  has.value <- DF$DATE > as.POSIXct(DT[ind], origin="1970-01-01") - tdiff & 
    DF$DATE < as.POSIXct(DT[ind], origin="1970-01-01")
  DF_clean[ind, ] <- DF[ has.value, ]
}