我正在处理数据,前两列是日期,第三列是符号,第四和第五列是价格。因此,我创建了一个数据子集,如下所示:
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 现在这是工作,我想添加第三个变量来绘制3d图表-任何建议,我可以做到这一点。谢谢!
发布于 2011-10-18 08:02:37
所以我认为这里发生的一些事情是值得讨论的:
首先是一些示例数据:
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来说并不真正“意味着”任何东西。**由于与其他R结构的一致性,编写test.sub[,1]更具R-ish风格。如果比较str(test.sub[1])和str(test.sub[,1])的结果,就会发现R对待它们的方式略有不同。
你说你输入了:
as.ts(test.sub)
plot(test.sub)我猜您对某种面向对象语言有丰富的经验;虽然R确实有一些面向对象的风格,但它不适用于这里。这并不是将test.sub转换为ts类的内容,而是执行转换并丢弃它,然后继续绘制您开始使用的数据框。这是一个很容易解决的问题:
test.sub.ts <- as.ts(test.sub)
plot(test.sub.ts)但是,这可能也不是你想要的。相反,R创建了一个时间序列,它有两个变量,名为"End“(这是现在被强制转换为整数的日期)和"EndP”。像这样有趣的事情是像zoo和xts这样的时间序列包流行起来的部分原因,所以我将更详细地介绍它们。
(不幸的是,据我所知,R没有使用默认的ts类保存日期戳,而是选择保存开始和结束日期以及频率。对于更一般的时间序列工作,这通常不够灵活。)
您也许可以通过键入以下命令来获得您想要的内容
plot(test.sub[,1], test.sub[,2]) 而不是
plot(test.sub[1], test.sub[2])由于前者遇到了麻烦,因为您传递的是两个子数据帧,而不是两个向量(尽管看起来像是).*
无论如何,使用xts (对于zoo也是类似的):
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,该方法获取单个数据帧,并尝试将第二个数据帧解释为附加的绘图参数,该参数在整个过程中会被误解,从而给出错误。
发布于 2011-10-18 17:01:53
如果您在引发错误后立即进行回溯,则得到有关不同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]最终被传递给xy.coords(),它正确地告诉您x有很多行,但y有0行,因为test.sub[1]只包含一个组件。
如果您使用plot(test.sub[,1], test.sub[,2], type = "l")或使用公式接口将变量命名为plot(V4 ~ V1, data = test.sub, type = "l"),如我在另一个答案中所示,它将会起作用。
发布于 2011-10-18 16:54:09
当然,使用公式界面会更容易:
> 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" )绘制它。
https://stackoverflow.com/questions/7800579
复制相似问题