R将data.frame转换为每日时间序列对象

时间:2013-09-23 11:48:01

标签: r dataframe time-series

我的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

......一周

2 个答案:

答案 0 :(得分:3)

在R中,多变量序列通常由每列一个序列表示,而不是行。使用动物园包可以像这样读取它(为了保持示例自包含,我们已经将其作为字符串读取,但您希望将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)和动物园帮助页面。

(注意,在这种情况下header=TRUE实际上并不是必需的,因为它会发现第一行是一个标题,因为剩下的行还有一个字段,即它们有行名称第一行没有。)

答案 1 :(得分:0)

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

使用dcast包中的reshape2

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