1

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

... 一个星期

4

2 回答 2

3

在 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 个动物园小插图 (pdf)和动物园帮助页面。

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

于 2013-09-23T13:25:29.823 回答
0

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

dcastreshape2包中使用:

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
于 2013-09-23T11:58:28.370 回答