r построить временной ряд для суммирования нескольких переменных - PullRequest
0 голосов
/ 22 мая 2018

Я впервые пытаюсь работать с графиками временных рядов.У меня есть набор данных с примерно 50 тыс. Строк с аналогичной структурой, как показано ниже для нескольких лет;

Year    expense_1   expense_2   expense_3   expense_4
1999    5           NA          NA          31.82
2000    2           NA          NA          4.75
1999    10.49       NA          NA          NA
2000    39.69       NA          NA          NA
2000    NA          NA          10.61       NA
1999    8.08        NA          NA          NA
2000    16          NA          NA          NA
1999    9.32        NA          NA          NA
1999    9.35        NA          NA          NA

Теперь я хочу построить временной ряд с Year на оси X * 1006.*, Expense на оси Y с разными строками для expense_1, expense_2, expense_3, expense_4.Расходы по каждой категории следует суммировать по годам, и NA следует удалить.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Вы можете позволить ggplot сделать большую часть работы за вас - просто gather, затем начните строить:

df %>%
  gather(expense, value, -Year) %>%
  ggplot(aes(x=Year, y=value, color=expense)) +
  geom_line(stat="summary", fun.y="sum")
0 голосов
/ 22 мая 2018

Вы можете вычислить sum, используя summarise_all, а затем преобразовать свои данные в длинный формат, чтобы было легче строить графики, используя ggplot

library(tidyverse)
library(scales)

df <- read.table(text = "Year    expense_1   expense_2   expense_3   expense_4
1999    5           NA          NA          31.82
                 2000    2           NA          NA          4.75
                 1999    10.49       NA          NA          NA
                 2000    39.69       NA          NA          NA
                 2000    NA          NA          10.61       NA
                 1999    8.08        NA          NA          NA
                 2000    16          NA          NA          NA
                 1999    9.32        NA          NA          NA
                 1999    9.35        NA          NA          NA",
                 header = TRUE, stringsAsFactors = FALSE)

# define summation function that returns NA if all values are NA
# By default, R returns 0 if all values are NA
sum_NA <- function(x) {
  if(all(is.na(x))) NA_integer_ else sum(x, na.rm = TRUE)
} 

df_long <- df %>% 
  group_by(Year) %>% 
  summarise_all(funs(sum_NA(.))) %>% 
  gather(key = "type", value = "expense", -Year)
df_long

#> # A tibble: 8 x 3
#>    Year type      expense
#>   <int> <chr>       <dbl>
#> 1  1999 expense_1   42.2 
#> 2  2000 expense_1   57.7 
#> 3  1999 expense_2   NA   
#> 4  2000 expense_2   NA   
#> 5  1999 expense_3   NA   
#> 6  2000 expense_3   10.6 
#> 7  1999 expense_4   31.8 
#> 8  2000 expense_4    4.75

ggplot(df_long, aes(x = Year, y = expense, color = type, group = type)) +
  geom_point() +
  geom_line() +
  scale_x_continuous(breaks = scales::pretty_breaks(n = 1)) +
  theme_bw()

Созданона 2018-05-21 пакетом представ (v0.2.0).

...