Преобразование данных панели - PullRequest
0 голосов
/ 10 ноября 2018

Я работаю с набором данных стран с разными значениями для разных моментов времени. Каждый месяц проводится одно наблюдение, поэтому я использовал функцию as.date так, чтобы даты были 01-07-2018, 01-08-2018 и т. Д. Для каждой страны и каждой даты существуют соответствующие значения. Я хочу преобразовать это в фрейм данных, где все значения стран агрегированы на дату. Я попытался изменить функцию так, чтобы

reshape(Origin_wide, idvar = "Origin", timevar = "V5", direction = "wide")

V5 - переменная даты, а Origin - страна. Это, насколько я могу судить, удаление набора as.date, чтобы даты и соответствующие значения больше не обрабатывались как таковые. Можно ли сделать это более плавно? Временной ряд данных ряда данных исчезает из-за потери функции изменения формы, так что я не могу различить временной ряд или построить его по дате и т. Д. Кроме того, даты получают префикс «value», что является той же проблемой, насколько я могу судить.

Вот такая структура данных:

|       V5            |        Origin    |  Value   |
|---------------------|------------------|----------|
|      01-09-2017     |        USA       |     45   |
|---------------------|------------------|----------|
|      01-10-2017     |        USA       |     47   |
|---------------------|------------------|----------|
|      01-11-2017     |        USA       |     49   |
|---------------------|------------------|----------|
|      01-09-2017     |        Canada    |     7    |
|---------------------|------------------|----------|
|      01-10-2017     |        Canada    |     13   |
|---------------------|------------------|----------|
|      01-11-2017     |        Canada    |     17   |
|---------------------|------------------|----------|

А вот как бы я хотел, чтобы это выглядело:

    |       V5            |        Canada    |  USA     |
    |---------------------|------------------|----------|
    |      01-09-2017     |        7         |     45   |
    |---------------------|------------------|----------|
    |      01-10-2017     |        13        |     47   |
    |---------------------|------------------|----------|
    |      01-11-2017     |        17        |     49   |
    |---------------------|------------------|----------|

Надеюсь, это имеет смысл. Чтобы воспроизвести случайную небольшую версию данных:

    set.seed(1)
Data <- data.frame(Value = sample(1:10), Origin = sample(c("Mexico", "USA","Canada"), 10, replace = TRUE))
dates <- sample(seq(as.Date('2018/01/01'), as.Date('2018/05/01'), by="month"), 10, replace = TRUE)
Data <- cbind(dates,Data)

Просмотр данных, полученных с помощью кода enter image description here

Как ясно здесь, значения определены не для всех дат. В этом случае значение для этой даты = 0. Так что в моей первой попытке с изменением формы он выдает NA для всех дат, где нет наблюдений, что было идеально, потому что я мог просто вставить 0.

1 Ответ

0 голосов
/ 10 ноября 2018

Восстановите ваши данные

library(tidyverse)

tbl <- tibble(
  V5 = rep(c("01-09-2017", "01-10-2017", "01-11-2017"), 2),
  Origin = rep(c("USA", "Canada"), each = 3),
  Value = c(45, 47, 49, 7, 13, 17)
)

Код

tbl %>%
  spread(Origin, Value)

Результат

# A tibble: 3 x 3
  V5         Canada   USA
  <chr>       <dbl> <dbl>
1 01-09-2017      7    45
2 01-10-2017     13    47
3 01-11-2017     17    49

Я не уверен, что это хорошая идея заменить NAна 0, потому что это действительно пропущенные значения, а не значения 0.Но если вы действительно хотите это сделать, то вы можете сделать следующее:

result <- tbl %>%
  spread(Origin, Value)

result[is.na(result)] <- 0

Примечание: пример вашей игрушки случайный и не соответствует структуре ваших фактических данных.Запуск кода на нем выводит довольно уродливый широкий формат.Когда вы создаете игрушечный пример, постарайтесь убедиться, что он отражает характеристики ваших реальных данных.

...