2016-10-17 14 views
6

создать фиктивный TimeSeries xts объекта с недостающими данными о дате 2-09-2015, как:дифференцироваться пропущенные значения из основных данных в участке с использованием R

library(xts) 
library(ggplot2) 
library(scales) 

set.seed(123) 
seq <- seq(as.POSIXct("2015-09-01"),as.POSIXct("2015-09-02"), by = "1 hour") 
ob1 <- xts(rnorm(length(seq),150,5),seq) 
seq2 <- seq(as.POSIXct("2015-09-03"),as.POSIXct("2015-09-05"), by = "1 hour") 
ob2 <- xts(rnorm(length(seq2),170,5),seq2) 
final_ob <- rbind(ob1,ob2) 
plot(final_ob) 
# with ggplot 
df <- data.frame(time = index(final_ob), val = coredata(final_ob)) 
ggplot(df, aes(time, val)) + geom_line()+ scale_x_datetime(labels = date_format("%Y-%m-%d")) 

После построения моих данных выглядит следующим образом: enter image description here

Красная прямоугольная часть представляет собой дату, в которой отсутствуют данные. Как я могу показать, что данные отсутствовали в этот день в основном сюжете?

Я думаю, что я должен показать эти недостающие данные с другим цветом. Но я не знаю, как мне обрабатывать данные, чтобы отразить недостающее поведение данных в основном графике.

+4

Спасибо за отличный воспроизводимый пример. –

+0

http://stackoverflow.com/questions/3321489/r-ggplot-plotting-irregular-time-series или, вероятно, http://stackoverflow.com/questions/21529332/how-to-not-plot-gaps-in- timeseries-with-r –

ответ

7

Спасибо за отличный воспроизводимый пример. Я думаю, что вам лучше пропустить эту строку в вашей «пропавшей» части. Если у вас есть прямая линия (даже в другом цвете), это предполагает, что данные были собраны в этот интервал, который выпал на эту прямую линию. Если вы опустите строку в этом интервале, то ясно, что там нет данных.

Проблема состоит в том, что вы хотите, чтобы почасовые данные были связаны линиями, а затем в строке «Отсутствующие данные» не было строк, поэтому вам нужно каким-то образом обнаружить этот раздел отсутствующих данных.

Вы не дали критериев для этого в своем вопросе, поэтому на основе вашего примера я скажу, что каждая строка на графике должна состоять из данных с часовыми интервалами; если есть перерыв более часа, тогда должна быть новая строка. Вам придется приспособить этот критерий к вашей конкретной проблеме. Все, что мы делаем, - это разделение вашего фрейма данных на биты, которые отображаются по одной строке.

Итак, сначала создать переменную, которая говорит которой «группа» (т.е. линия), каждый из данных находится в:

df$grp <- factor(c(0, cumsum(diff(df$time) > 1))) 

Затем вы можете использовать group= эстетику, которая geom_line использует разделить строки:

ggplot(df, aes(time, val)) + geom_line(aes(group=grp)) + # <-- only change 
    scale_x_datetime(labels = date_format("%Y-%m-%d")) 

enter image description here

+0

Спасибо большое :) –