转换面板数据

Transforming panal data

我正在处理一个国家数据集,不同的时间点有不同的值。每个月有一次观察,所以我使用了 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)

A look on the data as produced by the code

这里很明显,并未为所有日期定义值。在这种情况下,该日期的值 = 0。因此,在我第一次尝试重塑时,它会为所有没有观测值的日期生成 NA,这是完美的,因为我可以输入 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

我不确定用 0 替换 NA 是个好主意,因为那些确实是缺失值,而不是 0 的值。但是如果你真的想这样做,那么你可以这样做:

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

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

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