2016-12-12 2 views
1

Я получаю свою память для обмена с довольно простым циклом, и я не вижу проблемы. Я работаю над инструментом для очистки временных рядов по 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.;)

+2

вы можете использовать 'as.POSIXct (вар, происхождение =«1970-01-01»)' в качестве индекса строки кажется, что было бы очень большое количество, что приводит к создание очень большого кадра данных. Я думаю, вы хотите сохранить индекс своей строки и написать на это. Или даже лучше, векторизовать код. – mpjdem

+0

Ну да, это звучит неплохо, но я не знаю, как! Можете ли вы показать мне векторизованную версию? – Pelle

+0

Извините, я неправильно понял, я думал, что вы перебираете строки, но вы не были. Тем не менее проблема такая же, как мне кажется; ваш индекс строки очень большой при повторной присвоении. – mpjdem

ответ

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, ] 
} 
+0

Спасибо, что работает! Вы бы назвали это «векторизованным» сейчас? И если кто-то будет таким добрым: почему это не работает, когда я объявляю его в цикле? 'rownames (DF_clean [ind,]) <- ind' – Pelle

+0

@Pelle Хорошо вроде векторизованного ... Возможно, вам стоит прочитать [this] (http://stackoverflow.com/questions/2908822/speed-up-the-loop -операция-в-г) в любом случае ;-) – Christoph

+0

@Pelle На ваш вопрос: ind - это только последнее значение. Если вам нравится, вы можете использовать 'length (rownames (DF_clean))' предоставление '[1] 4313', а затем' rownames (DF_clean) <- c (1: 4313) '... – Christoph

Смежные вопросы