我正在处理数据,前两列是日期,第三列是符号,第四列和第五列是价格。 所以,我创建了一个数据子集如下:
test.sub<-subset(test,V3=="GOOG",select=c(V1,V4)
然后我尝试使用以下
绘制时间序列图as.ts(test.sub)
plot(test.sub)
好吧,它给了我一个散点图 - 不是我想要的。
所以,我试过plot(test.sub[1],test.sub[2])
现在我收到以下错误:
Error in xy.coords(x, y, xlabel, ylabel, log) :
'x' and 'y' lengths differ
确保没有。行是相同的,我运行nrow(test.sub[1])
和nrow(test.sub[2])
并且它们都返回相同的行,所以作为R的新手,我不确定修复是什么。
我也运行了plot.ts(test.sub)
,但是它没有显示x轴上的日期,它与plot(test.sub)
一起使用,这是我想看到的。
test.sub[1]
V1
1107 2011-Aug-24
1206 2011-Aug-25
1307 2011-Aug-26
1408 2011-Aug-29
1510 2011-Aug-30
1613 2011-Aug-31
1718 2011-Sep-01
1823 2011-Sep-02
1929 2011-Sep-06
2035 2011-Sep-07
2143 2011-Sep-08
2251 2011-Sep-09
2359 2011-Sep-13
2470 2011-Sep-14
2581 2011-Sep-15
2692 2011-Sep-16
2785 2011-Sep-19
2869 2011-Sep-20
2965 2011-Sep-21
3062 2011-Sep-22
3160 2011-Sep-23
3258 2011-Sep-26
3356 2011-Sep-27
3455 2011-Sep-28
3555 2011-Sep-29
3655 2011-Sep-30
3755 2011-Oct-03
3856 2011-Oct-04
3957 2011-Oct-05
4059 2011-Oct-06
4164 2011-Oct-07
4269 2011-Oct-10
4374 2011-Oct-11
4479 2011-Oct-12
4584 2011-Oct-13
4689 2011-Oct-14
str(test.sub)
'data.frame': 35 obs. of 2 variables:
$ V1:Class 'Date' num [1:35] NA NA NA NA NA NA NA NA NA NA ...
$ V4: num 0.475 0.452 0.423 0.418 0.403 ...
head(test.sub) V1 V4
1212 <NA> 0.474697
1313 <NA> 0.451907
1414 <NA> 0.423184
1516 <NA> 0.417709
1620 <NA> 0.402966
1725 <NA> 0.414264
现在这个工作正常,我想添加一个第三个变量来绘制一个三维图表 - 任何建议我如何做到这一点。 THX!
答案 0 :(得分:14)
所以我认为这里有一些值得讨论的事情:
首先,一些示例数据:
test <- data.frame(End = Sys.Date()+1:5,
Start = Sys.Date()+0:4,
tck = rep("GOOG",5),
EndP= 1:5,
StartP= 0:4)
test.sub = subset(test, tck=="GOOG",select = c(End, EndP))
首先,请注意test和test.sub都是数据帧,因此像test.sub[1]
这样的调用并不真正意味着“R”的任何内容。**写test.sub[,1]
更多的是R-ish凭借与其他R结构的一致性。如果您比较str(test.sub[1])
和str(test.sub[,1])
的结果,您会看到R稍微区别对待它们。
你说你输入了:
as.ts(test.sub)
plot(test.sub)
我猜你在某种OO语言方面有丰富的经验;虽然R确实有一些OO味道,但它不适用于此。不是将test.sub转换为类ts的东西,而是仅进行转换并将其抛弃,然后继续绘制您开始使用的数据框。这很容易解决:
test.sub.ts <- as.ts(test.sub)
plot(test.sub.ts)
但是,这可能不是你想要的。相反,R创建一个时间序列,其中包含两个名为“End”的变量(现在是强制转换为整数的日期)和“EndP”。像这样的有趣的业务是像动物园和xts这样的时间序列包已经流行的部分原因,所以我会详细介绍它们。
(不幸的是,据我所知,R不会使用默认的ts类保留日期戳,而是选择保留开始和结束日期以及频率。对于更一般的时间序列工作,这很少足够灵活)
您可以通过输入
来获得所需内容plot(test.sub[,1], test.sub[,2])
而不是
plot(test.sub[1], test.sub[2])
因为前者遇到麻烦,因为你传递了两个子数据帧而不是两个向量(即使它看起来像你的那样)。 *
无论如何,使用xts(同样适用于动物园):
library(xts) # You may need to install this
xtemp <- xts(test.sub[,2], test.sub[,1]) # Create the xts object
plot(xtemp)
# Dispatches a xts plot method which does all sorts of nice time series things
希望其中一些有用并且对于未被识别的内联代码感到抱歉:仍然习惯于堆栈溢出。
迈克尔
**实际上,他们访问内部用于构建数据框的列表,但这比代码值得依赖的代码更具细微差别。
***实质是当你将plot(test.sub[1], test.sub[2])
传递给R时,它调度方法plot.data.frame
,该方法占用一个数据帧,并尝试将第二个数据帧解释为附加的图在某个地方被误解的参数,给出了你的错误。
答案 1 :(得分:2)
如果您在引发错误后立即执行回溯,那么您获得有关不同x
和y
长度的错误的原因立即显而易见:
> plot(test.sub[1],test.sub[2])
Error in xy.coords(x, y, xlabel, ylabel, log) :
'x' and 'y' lengths differ
> traceback()
6: stop("'x' and 'y' lengths differ")
5: xy.coords(x, y, xlabel, ylabel, log)
4: plot.default(x1, ...)
3: plot(x1, ...)
2: plot.data.frame(test.sub[1], test.sub[2])
1: plot(test.sub[1], test.sub[2])
你的电话中的问题是多方面的。首先,如@mweylandt test.sub[1]
所述,是一个包含单个组件的数据框,而不是由test.sub
的第一个组件的内容组成的向量。
从回溯中,我们看到调用了plot.data.frame
方法。 R很乐意绘制数据框,只要它至少有两列。 R接过你的话并将test.sub[1]
(作为data.frame)传递给plot()
- test.sub[2]
永远不会查看。test.sub[1]
最终传递给{ {1}}正确通知您xy.coords()
有很多行,x
有0行,因为y
只包含一个组件。
如果您已完成test.sub[1]
或使用公式界面命名变量plot(test.sub[,1], test.sub[,2], type = "l")
,那将会有效,如我在其他答案中所示。
答案 2 :(得分:1)
当然,使用公式界面更容易:
> test <- data.frame(End = Sys.Date()+1:5,
+ Start = Sys.Date()+0:4,
+ tck = rep("GOOG",5),
+ EndP= 1:5,
+ StartP= 0:4)
>
> test.sub = subset(test, tck=="GOOG",select = c(End, EndP))
> head(test.sub)
End EndP
1 2011-10-19 1
2 2011-10-20 2
3 2011-10-21 3
4 2011-10-22 4
5 2011-10-23 5
> plot(EndP ~ End, data = test.sub, type = "l")
我广泛使用时间序列类型数据,很少(如果有的话)需要"ts"
类对象。包 zoo 和 xts 非常有用,但如果您只想绘制数据,i)将日期/时间信息正确格式化/设置为"Date"
或"POSIXt"
类对象,然后ii)只使用标准图形和type = "l"
(或type = "b"
或type = "o"
绘制它,如果您想查看观察结果次)。