2015-12-31 3 views
2

У меня есть временной ряд со значениями в Time = 23:00:00, которые всегда ошибочны, поэтому мне нужно изменить эти значения.Изменение значения до значения с задержкой в ​​r

Образца данные:

data <- data.table(
    Time =c("20:47:00","20:52:00","21:25:00","22:25:00","23:00:00","01:02:00"), 
    Open = c(21.306,21.305,21.305,21.300,22.900,21.286), 
    TotalVolume = c(5,20,15,11,19,4) 
    ) 

Который выглядит следующим образом:

Time  Open  TotalVolume 
1: 20:47:00 21.306 5 
2: 20:52:00 21.305 20 
3: 21:25:00 21.305 15 
4: 22:25:00 21.300 11 
5: 23:00:00 22.900 19 
6: 01:02:00 21.286 4 

Я хотел бы заменить ОТКРЫТОЕ значение при времени = 23:00:00 с открытым значением непосредственно перед ней. Который должен выглядеть следующим образом:

Time  Open  TotalVolume 
1: 20:47:00 21.306 5 
2: 20:52:00 21.305 20 
3: 21:25:00 21.305 15 
4: 22:25:00 21.300 11 
5: 23:00:00 21.300 19 
6: 01:02:00 21.286 4 

Я попытался с помощью функции задержки без желаемых результатов:

data$Open[data$Time == "23:00:00"] <- lag(data,1) 

и

data$Open[data$Time == "23:00:00"] <- lag(data$Open[data$Time == "23:00:00"],1) 
+0

Если вы уже используете 'data.table', вы можете взглянуть на' data.table :: shift' –

ответ

3
> n <- which(data$Time=="23:00:00") 
> data$Open[n] <- data$Open[n-1] 
> data 
     Time Open TotalVolume 
1: 20:47:00 21.306   5 
2: 20:52:00 21.305   20 
3: 21:25:00 21.305   15 
4: 22:25:00 21.300   11 
5: 23:00:00 21.300   19 
6: 01:02:00 21.286   4 
> 

n содержит позицию (ы) где время «23:00:00», так что п-1 являются позиции сразу, предшествующих «23: 00:00" -positions. Следовательно, назначение data$Open[n] <- data$Open[n-1] делает то, что мы хотим.

+0

Это изменит только первую строку, где происходит «23: 00: 00». И, если этого не происходит, код не будет работать. – Gopala

+0

Хотя этот ответ, вероятно, правильный и полезный, рекомендуется, если вы [включите некоторое объяснение вместе с ним] (http://meta.stackexchange.com/q/114762/159034), чтобы объяснить, как это помогает решить проблему. Это становится особенно полезным в будущем, если есть изменения (возможно, не связанные), которые заставляют его перестать работать, а читатели должны понимать, как он работал. –

+0

@ user3949008: Теперь он работает, независимо от того, сколько «23:00:00» есть. Готовы ли вы отозвать свой downvote? – mra68

2

Попробуйте использовать это:

library(dplyr) 
> data <- data.table(
+  Time =c("20:47:00","20:52:00","21:25:00","22:25:00","23:00:00","01:02:00"), 
+  Open = c(21.306,21.305,21.305,21.300,22.900,21.286), 
+  TotalVolume = c(5,20,15,11,19,4) 
+) 
> data <- data %>% mutate(Open = ifelse(Time == '23:00:00', lag(Open), Open)) 
> data 
     Time Open TotalVolume 
1: 20:47:00 21.306   5 
2: 20:52:00 21.305   20 
3: 21:25:00 21.305   15 
4: 22:25:00 21.300   11 
5: 23:00:00 21.300   19 
6: 01:02:00 21.286   4 

Вы также можете использовать этот способ без функции dplyr мутируют, например так:

> data <- data.table(
+  Time =c("20:47:00","20:52:00","21:25:00","22:25:00","23:00:00","01:02:00"), 
+  Open = c(21.306,21.305,21.305,21.300,22.900,21.286), 
+  TotalVolume = c(5,20,15,11,19,4) 
+) 
> data$Open <- ifelse(data$Time == '23:00:00', lag(data$Open), data$Open) 
> data 
     Time Open TotalVolume 
1: 20:47:00 21.306   5 
2: 20:52:00 21.305   20 
3: 21:25:00 21.305   15 
4: 22:25:00 21.300   11 
5: 23:00:00 21.300   19 
6: 01:02:00 21.286   4 
+1

Вы используете 'dplyr' в обоих решениях. –

+0

Извините, вы правы, что отставание от этого пакета. Я отредактировал, чтобы уточнить. Спасибо за уловку. – Gopala

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