Использование xblocks для интерполированных значений по временным рядам в r - PullRequest
0 голосов
/ 28 февраля 2019

У меня проблемы с выяснением, как использовать xblocks () для работы.Во-первых, вот небольшой пример из гораздо большего набора данных:

data <- data.frame(
    Date = sample(c("1993-07-05", "1993-07-05", "1993-07-05", "1993-08-30", "1993-08-30", "1993-08-30", "1993-08-30", "1993-09-04", "1993-09-04")),   
    Oxygen = sample(c("0.9", "0.4", "4.2", "5.6", "7.3", NA, "9.5", NA, "0.3")))

Затем я усредняю ​​значения для каждого месяца, используя xts:

xtsAveragedata <- xts(Averagedata[-1], Averagedata[[1]])
xtsAverageMonthlyData <- apply.monthly(xtsAveragedata, FUN = mean)

Теперь я линейно интерполировал свои данные:

Interpolateddata <- na.approx(xtsAverageMonthlyData)

Я хочу создать фигуру, в которой я использую xblocks () или что-то подобное, чтобы показать области в моих данных, где я использовал интерполяцию, что-то вроде этого, которое я нашел в Интернете: enter image description here

Как мне сделать это для всех значений / автоматизировать весь мой набор данных?Нет примеров, которые я мог бы перевести на что-то подобное из справочника.

Спасибо за вашу помощь.С благодарностью.

1 Ответ

0 голосов
/ 28 февраля 2019

Так что здесь не используются xts или zoo, но, возможно, это пошаговое руководство будет полезным.Я использую немного больший (и ежедневный) набор данных, но он должен воспроизводиться:

library(tidyverse)
library(lubridate)

set.seed(4)
df <- tibble(
  Date = seq.Date(ymd("1993-07-01"), by = "1 day", length.out = 100),
  Oxygen = runif(100, 0, 10)
)

# Randomly assign 20 records to NA
df[sample(1:nrow(df), 20), "Oxygen"] <- NA

df_for_plot <- df %>%
  arrange(Date) %>%
  group_by(month(Date)) %>%
  mutate(
    is_na = is.na(Oxygen),
    month_avg = mean(Oxygen, na.rm = TRUE),
    oxygen_to_plot = if_else(is_na, month_avg, Oxygen)
  )

df_for_plot
#> # A tibble: 100 x 6
#> # Groups:   month(Date) [4]
#>    Date        Oxygen `month(Date)` is_na month_avg oxygen_to_plot
#>    <date>       <dbl>         <dbl> <lgl>     <dbl>          <dbl>
#>  1 1993-07-01  5.86               7 FALSE      5.87         5.86  
#>  2 1993-07-02  0.0895             7 FALSE      5.87         0.0895
#>  3 1993-07-03  2.94               7 FALSE      5.87         2.94  
#>  4 1993-07-04  2.77               7 FALSE      5.87         2.77  
#>  5 1993-07-05  8.14               7 FALSE      5.87         8.14  
#>  6 1993-07-06 NA                  7 TRUE       5.87         5.87  
#>  7 1993-07-07  7.24               7 FALSE      5.87         7.24  
#>  8 1993-07-08  9.06               7 FALSE      5.87         9.06  
#>  9 1993-07-09  9.49               7 FALSE      5.87         9.49  
#> 10 1993-07-10  0.731              7 FALSE      5.87         0.731 
#> # ... with 90 more rows

# Plot the regular data, but for the geom_rect use only the filtered data where the is_na column is TRUE.
# Assuming you have daily data, you just set the xmax to be that Date + 1.
ggplot(df_for_plot, aes(x = Date, y = oxygen_to_plot)) +
  geom_line() +
  geom_rect(
    data = df_for_plot %>% filter(is_na), 
    aes(xmin = Date, xmax = Date + 1, ymin = -Inf, ymax = +Inf), fill = "skyblue", alpha = 0.5
  )

...