Как я могу преобразовать этот фрейм данных в объект нескольких временных рядов в R? - PullRequest
0 голосов
/ 09 марта 2020

Я пытаюсь очистить некоторые данные (https://github.com/CSSEGISandData/COVID-19/blob/master/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Confirmed.csv), касающиеся нового коронавируса COVID19, для проведения различных видов анализа (ie. Создать диаграмму стран со 100 случаями с течением времени, или отслеживать смертность с течением времени в каждой стране). Я использовал данные, у которых даты были столбцами, а страны - строками. Я переместил Dataframe так, чтобы у меня был столбец для каждой страны и один столбец дат, как показано ниже.

enter image description here

Я попытался прочитать это Кадр данных в качестве объекта временного ряда через следующий код:

covid19ts = ts(covid19, frequency = 365, start = c(2020,22))

В результате получается следующее. Вместо того, чтобы получать даты в качестве столбца индекса, я получаю число от 1 до 47 (количество записанных дней). Это приводит к тому, что я не могу создавать диаграммы или проводить какой-либо значимый анализ.

enter image description here

Я также попробовал следующий код, используя пакет lubridate с теми же результатами:

covid19ts = ts(covid19, frequency = 365, start= decimal_date(as.Date("2020-01-22")))

Как я могу сделать мои даты в настоящие даты для составления графиков и анализа?

Или я мог бы использовать совершенно другой подход, который был бы лучше для анализа, который я пытаюсь сделать?

Спасибо за ваша помощь.

Ответы [ 2 ]

2 голосов
/ 09 марта 2020

Вы можете хранить данные в виде фрейма данных и делать полезные графики. Возможно получить данные в длинном формате.

library(tidyverse)
df <- read.csv('https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_19-covid-Confirmed.csv', check.names = FALSE)
df1 <- df %>% pivot_longer(cols = -(1:4)) 
head(df1)

# A tibble: 6 x 6
#  `Province/State` `Country/Region`   Lat  Long name    value
#  <fct>            <fct>            <dbl> <dbl> <chr>   <int>
#1 Anhui            Mainland China    31.8  117. 1/22/20     1
#2 Anhui            Mainland China    31.8  117. 1/23/20     9
#3 Anhui            Mainland China    31.8  117. 1/24/20    15
#4 Anhui            Mainland China    31.8  117. 1/25/20    39
#5 Anhui            Mainland China    31.8  117. 1/26/20    60
#6 Anhui            Mainland China    31.8  117. 1/27/20    70

Если вы хотите преобразовать данные во временные ряды, как показано в вашем сообщении, вы можете сделать:

df2 <- df1 %>%
         group_by(`Country/Region`, name) %>%
         summarise(value = sum(value)) %>%
         pivot_wider(names_from = `Country/Region`, values_from = value, 
         values_fill = list(value = 0))

ts_data <- xts::xts(df2[-1], as.Date(df2$name, "%m/%d/%y"))

Альтернативное решение, предложенное @G. Гротендик, полагаясь на zoo, равен

z <- read.zoo(df1[c(2, 5:6)], index = "name", split = "Country/Region", 
              format = "%m/%d/%Y", aggregate = sum)

read.zoo, избегая явного агрегирования и преобразования в tidyverse. Затем мы можем использовать функцию autoplot для построения этого zoo объекта.

1 голос
/ 09 марта 2020

Вместо использования ts или xts объектов лучше всего подходит такой формат tsibble.

library(tidyverse)
library(tsibble)
library(feasts)

covid19 <- read_csv("time_series_19-covid-Confirmed.csv") %>%
  pivot_longer(cols = -(1:4)) %>%
  mutate(date = lubridate::mdy(name)) %>%
  select(-name) %>%
  rename(
    "Region" = `Province/State`,
    "Country" = `Country/Region`
  ) %>%
  as_tsibble(key = c(Region, Country), index = date)

# Plot by country
covid19 %>%
  filter(Country %in% c("China", "Italy", "Iran", "South Korea")) %>%
  group_by(Country) %>%
  summarise(value = sum(value)) %>%
  autoplot(value)

Создано в 2020-03-09 пакетом Представ (v0.3.0)

...