我让我的记忆与一个非常简单的循环交换,我看不到问题。我正在研究一种工具来清理10分钟时间步的时间序列。它可能有时间步长,双倍时间步长和不规则的10分钟间隔时间步长。我的方法是首先生成“干净”的时间序列,然后匹配“好的”时间步骤。在那之后,我想检查超出常规的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)
添加一些“不良”数据:
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), ]
定义一些时间变量和最终的“干净”时间序列:
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
。
我还没有尝试过任何软件包,因为我真正对基础R解决方案感兴趣,因为在我不了解任何软件包之前我没有真正理解基础R.;)
答案 0 :(得分:2)
这就是你要找的东西:
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, ]
}