转换全景数据

时间:2018-11-09 21:30:23

标签: r time reshape series

我正在使用国家/地区数据集,在不同的时间点具有不同的值。每个月只有一次观察,因此我使用了as.date功能,例如日期为01-07-2018、01-08-2018等。 对于每个国家和每个日期都有一个对应的值。 我想将其转换为一个数据框,其中所有国家/地区的值都在某个日期汇总。 我已经尝试过重塑功能,

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

V5是日期变量,而Origin是国家。 据我所知,这删除了as.date集合,因此日期和相应的值不再被这样处理。 可以更顺利地完成吗?数据序列的时间序列方面使重新整形功能丢失,因此我无法更改时间序列或按日期绘制等。 此外,日期获得了“值”前缀,据我所知这是同样的问题。

以下是数据结构:

|       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)

A look on the data as produced by the code enter image description here

很显然,这里没有为所有日期定义值。在这种情况下,该日期的值=0。因此,在我进行重塑的第一次尝试中,它为所有没有观测值的日期生成了NA,这是完美的,因为我能够只输入0。

1 个答案:

答案 0 :(得分:0)

重新创建数据

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

注意:您的玩具示例是随机的,并不代表您实际数据的模式。在其上运行代码将输出一个非常难看的宽格式。创建玩具示例时,请尝试确保它能反映真实数据的特征。