【问题标题】:Transforming panal data转换面板数据
【发布时间】:2019-04-13 11:34:23
【问题描述】:

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

这里很清楚,并不是所有日期都定义了值。在这种情况下,该日期的值为 = 0。因此,在我第一次尝试使用 reshape 时,它​​会为所有没有观察到的日期产生 NA,这是完美的,因为我能够只输入 0。

【问题讨论】:

  • 您能否提供一个最小的可重现示例,link,包括您的数据和预期结果。
  • 当然可以。它现在就在这里!
  • 感谢您添加一些数据,但如果您的数据可重现,您更有可能在这里获得帮助。上面的评论包括一个解释如何做到这一点的链接 - 请阅读它。这是具体的r examples
  • 我很抱歉我对这个问题缺乏特殊性。我添加了应该重新创建我正在使用的数据版本的 som 代码。如果您需要更多信息,请告诉我。

标签: r time reshape series


【解决方案1】:

重新创建您的数据

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

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

【讨论】:

  • 谢谢!这似乎正是我所需要的。我将日期作为列获取,是否有将它们作为行名获取,但仍保留格式,以便我能够根据日期值执行操作?这样我就可以采用 diff() 和 ge 的第一个区别。如果我现在尝试这个,我得到 error_: Error in r[i1] - r[-length(r):-(length(r) - lag + 1L)] : non-numeric argument to binary operator
  • 如果你想将你的 V5 变量转换为行名,你可以使用 tibble::column_to_rownames() (注意你在你的问题中没有问任何关于这个的问题,所以我不会编辑我的回答,否则它将不再回答您的问题)。
  • 我确实错过了你关于NA 的最后一个问题,所以我将为此编辑我的答案。 (如果我上面的评论不够清楚,如果你编辑你的问题,我也会在我的回答中添加column_to_rownames())。
  • 感谢您的帮助。
  • 我试图找出我的例子有问题。您能否详细说明您对此的说明?
猜你喜欢
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 2021-12-18
  • 2014-07-22
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多