【问题标题】:Time Series Data in RR中的时间序列数据
【发布时间】:2015-04-13 18:33:40
【问题描述】:

我对 R 有基本的了解,主要需要能够运行回归和汇总统计数据,所以如果我的知识出现任何空白,我希望能指出正确的方向。

我有 CSV 格式的时间序列数据,格式如下:

Facility ID, Utility Type, Account No, Unit Name, Date 1, Date 2, Date 3, Date 4

将有多个行用于引用唯一公用事业类型和设施的特定帐号(即,单位名称 = L 的一行条目,单位名称 = 美元的一行条目)。在每个“日期”列中输入特定单位在每个日期的帐号值。我希望能够编写一个脚本,使我能够重新导出每个日期列不包含多个单元条目的数据。然后我还想为 R 指定 Date 列代表每月时间序列数据点,并从那里进行各种时间序列分析。

感谢您帮助我告诉我如何清理这些数据。

根据要求,样本数据:

Facility ID, Facility Name, State, Utility Type, Supplier, Account No., Unit Name, 7/1/14, 8/1/14
4015, Palm Court Apts, CA, Chilled Water, PG&E, 87993, USD, 42333, 41775
4015, Palm Court Apts, CA, Chilled Water, PG&E, 87993, ton-hr, 244278, 238035
4044, 18 Sawtelle, CA, Natural Gas, Chevron, 17965, USD, 4860, 5890
4044, 18 Sawtelle, CA, Natural Gas, Chevron, 17965, M^3, 7639, 8895

示例输出:

Facility ID, Facility Name, State, Utility Type, Supplier, Account No., Quantity Consumed, Unit of Measure, Utility Bill, Currency, Date
4015, Palm Court Apts, CA, Chilled Water, PG&E, 87993, 244278, ton-hr, 42333, USD, 7/1/14
4015, Palm Court Apts, CA, Chilled Water, PG&E, 87993, 238035, ton-hr, 41775, USD, 8/1/14
4044, 18 Sawtelle, CA, Natural Gas, Chevron, 17965, 7639, M^3, 4860, USD, 7/1/14
4044, 18 Sawtelle, CA, Natural Gas, Chevron, 17965, 8895, M^3, 5890, USD, 8/1/14

【问题讨论】:

  • 您应该尝试help(unstack) 或者,查看 reshape2 包以了解如何进行操作。
  • 您能否在这些列中显示一些示例数据?以及您希望输出的外观如何? (这样我们就有了一个可重现的例子)
  • 谢谢@slhck,我添加了几行数据
  • @slhck,输出取决于您认为最适合时间序列数据的内容。 7/1/14-USD、7/1/14-ton-hr 的列标题可以使用;但是我不会有一个专用日期值的列标题。
  • “238,035”是一个错误,对吧?一栏太多了:)

标签: r time-series data-manipulation


【解决方案1】:
library(reshape2)
d = read.csv("data.csv")
d.molten = melt(d, 
  id.vars=c("Facility.ID", "Facility.Name", "State", "Utility.Type", "Supplier", "Account.No.", "Unit.Name"), 
  variable.name = "Date"
)

melt 函数将“宽”格式(列数未定义)分解为“长”格式,其中每一行都是一个观察值。这实际上是您在 R 中所做的大多数事情的首选格式,至少在使用 packages from the "Hadleyverse" 时是这样。特别是对于时间序列。

但我们还没有完成。现在你有以下结构:

Facility.ID    Facility.Name …  Date  value
       4015  Palm Court Apts X7.1.14  42333

我们必须修复当前只是“字符串”的日期。因为列名不能以数字开头,并且不能包含空格,所以它们前面有一个“X”。

d.molten$Date=as.Date(d.molten$Date, "X%m.%d.%y")

现在您的日期看起来是正确的,并且每次观察都有一行:

Facility.ID    Facility.Name …     Date  value
       4015  Palm Court Apts 2014-07-01  42333

现在我们可以轻松绘制时间序列了:

library(ggplot2)
ggplot(d.molten, 
  aes(x = Date, y = value, color = Facility.Name)) + 
  geom_point()

【讨论】:

  • 非常有帮助,谢谢!还有一个问题,如果我希望在同一行的特定数据中拥有与某个帐号相关的所有时间序列值怎么办?我将在上面发布一个示例输出。
  • 您的示例每个日期只有一个值,并且您的输出与您在我的答案中应用命令的输出基本相同,除了“值”列重命名为“公用事业账单” . “所有时间序列值 [...] 在同一行中”是指为同一帐号在同一日期获取的每个值添加一个新列吗?这不会再次成为您的输入格式吗?我有点困惑……
  • 澄清一下,以我的输入格式;特定日期是列标题,在输出中,“日期”成为列标题,特定日期成为行值。查看输入格式,以“USD”作为“单位名称”值的行中的每个值在不同行中具有相应的消耗量值,其中“ton-hr”、“M^3”或“KWH”为“单位名称”值。从样本输入数据到输出,您可以看到,在一个示例中,对于账户 87993,消耗了 244278 吨小时,成本为 42333 美元。在输出中,这被组织成一行。希望对您有所帮助。
猜你喜欢
  • 2015-07-28
  • 2021-09-16
  • 2012-05-15
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
  • 2020-10-13
  • 2014-03-02
相关资源
最近更新 更多