Я получаю свою память для обмена с довольно простым циклом, и я не вижу проблемы. Я работаю над инструментом для очистки временных рядов по 10-минутным шагам. Он может иметь промежутки времени, двойные временные шаги и нерегулярные 10-минутные интервалы времени. Мой подход состоит в том, чтобы сначала создать «чистый» временной ряд и соответствовать «хорошим» шагам времени. После этого я хотел бы проверить внеуровневые-10-минутные интервалы времени. Здесь возникает проблема. Извините за длинный код:Простая петля приводит к переполнению памяти (база R)
Test Generation Data:
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"
, он работает. Запуск всей петли приводит к обмену памяти. Я думаю, что это имеет какое-то отношение к использованию POSIXct внутри цикла и внутри [], но я не мог понять, как использовать - tdiff
в противном случае.
Я не пробовал все пакеты еще потому, что я Acctually заинтересован в основание R раствора, после того, как я был разработан, чтобы избежать каких-либо пакетов здесь, прежде чем я на самом деле не понимаю базу R.;)
вы можете использовать 'as.POSIXct (вар, происхождение =«1970-01-01»)' в качестве индекса строки кажется, что было бы очень большое количество, что приводит к создание очень большого кадра данных. Я думаю, вы хотите сохранить индекс своей строки и написать на это. Или даже лучше, векторизовать код. – mpjdem
Ну да, это звучит неплохо, но я не знаю, как! Можете ли вы показать мне векторизованную версию? – Pelle
Извините, я неправильно понял, я думал, что вы перебираете строки, но вы не были. Тем не менее проблема такая же, как мне кажется; ваш индекс строки очень большой при повторной присвоении. – mpjdem