我的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
......一周
答案 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