【问题标题】:R convert a data.frame to a daily time series objectR将data.frame转换为每日时间序列对象
【发布时间】:2013-09-23 11:48:00
【问题描述】:

我的 data.frame 是这样的

  name units_sold order_date
1 obj1         10 2013-09-21
2 obj1         10 2013-09-22
3 obj1         10 2013-09-23
4 obj2        100 2013-09-21
5 obj2        200 2013-09-22
6 obj2        300 2013-09-23
7 obj3         70 2013-09-21
8 obj3        200 2013-09-22
9 obj3         50 2013-09-23

我想将其转换为时间序列对象,使其具有以下格式的值:

       2013-09-21  2013-09-22 2013-09-23
obj1      10            10         10
obj2      100           200        300
obj3      70            200        50

...一周

【问题讨论】:

  • 欢迎来到 Stack Overflow,感谢您尝试在您的问题中包含数据。不幸的是,很难看到您的数据是如何基于上述结构构建的,或者您的目标是什么新格式。请阅读dput 的帮助页面(输入?dput),它将解释如何将对象转换为文本。更好的是,请仔细阅读 this post 以获取有关如何生成良好可重现示例的提示。最后,您应该包括您编写的代码,即使它不起作用。

标签: r dataframe time-series


【解决方案1】:

在 R 中,多元序列通常由每列一个序列表示,而不是每行。使用 zoo 包,可以像这样读取它(为了保持示例自包含,我们已将其作为字符串读取,但您希望将 text=Lines 替换为 file="myfile.dat" 之类的东西):

Lines <- "name units_sold order_date
1 obj1         10 2013-09-21
2 obj1         10 2013-09-22
3 obj1         10 2013-09-23
4 obj2        100 2013-09-21
5 obj2        200 2013-09-22
6 obj2        300 2013-09-23
7 obj3         70 2013-09-21
8 obj3        200 2013-09-22
9 obj3         50 2013-09-23
"

library(zoo)
z <- read.zoo(text = Lines, header = TRUE, index = 3, split = 1)

给出:

> z
           obj1 obj2 obj3
2013-09-21   10  100   70
2013-09-22   10  200  200
2013-09-23   10  300   50

从这一点开始,您可以绘制它 (plot(z)),将其转换为 ts 系列(as.ts(z) 尽管日常时间系列通常不与 ts 一起使用)并执行许多其他操作。请参阅同一链接中的5 zoo vignettes (pdfs) 和 zoo 帮助页面。

(请注意,在这种情况下header=TRUE实际上不是必需的,因为它会根据剩余行有一个字段的事实来确定第一行是标题,即它们有行名,而第一行行没有。)

【讨论】:

    【解决方案2】:

    我不认为预期的输出是 ts 对象。我将您的问题理解为从长格式到宽格式的重塑问题。这里有两种方法:

    使用来自reshape2 包的dcast

    library(reshape2)
    dcast(dat,name~order_date,value.var="units_sold")
    
     name 2013-09-21 2013-09-22 2013-09-23
    1 obj1         10         10         10
    2 obj2        100        200        300
    3 obj3         70        200         50
    

    使用基础包中的reshape

    reshape(dat,direction='wide',idvar='name',timevar='order_date')
    
     name units_sold.2013-09-21 units_sold.2013-09-22 units_sold.2013-09-23
    1 obj1                    10                    10                    10
    4 obj2                   100                   200                   300
    7 obj3                    70                   200                    50
    

    【讨论】:

    • 不过,这不会产生时间序列对象。
    猜你喜欢
    • 2021-02-13
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 2018-06-23
    • 2021-03-05
    • 1970-01-01
    • 2021-01-28
    • 2021-11-12
    相关资源
    最近更新 更多