我定期构建一个包含时间值(源自xts或zoo对象)的数据框,以进行分析和绘图。这是一个例子:
library(xts)
x1 <- xts(rnorm(10), as.Date("2012-01-01") + 0:9)
x2 <- xts(rnorm(10), as.Date("2012-01-04") + 0:9)
(df <- data.frame(merge(x1=x1, x2=x2), v1=4:16, v2=rnorm(13)))
x1 x2 v1 v2
2012-01-01 0.1930827 NA 4 1.05972724
2012-01-02 0.4429592 NA 5 -1.89299068
2012-01-03 1.6657630 NA 6 0.70445966
2012-01-04 -0.2765922 -0.26728223 7 0.35336959
2012-01-05 -0.1756590 -2.04888130 8 0.90129924
2012-01-06 -2.4849132 0.49400975 9 1.54486914
2012-01-07 -0.9993353 -1.09308203 10 1.16600015
2012-01-08 -0.7326309 0.55781566 11 0.37178542
2012-01-09 -0.2973543 -0.59872496 12 0.07512468
2012-01-10 -1.5061380 0.08567125 13 1.77494367
2012-01-11 NA 0.81835375 14 -0.38211167
2012-01-12 NA 1.30131894 15 -1.09220795
2012-01-13 NA -1.29505649 16 1.27148069
要绘制时间序列,我需要使用as.Date(row.names(df))
作为水平轴。例如:
plot(as.Date(row.names(df)), df$x1, type="l", xlab="", ylab="Test", main="Using row.names()", col="red")
lines(as.Date(row.names(df)), df$x2, col="blue")
lines(as.Date(row.names(df)), df$v2, col="green")
一遍又一遍地使用as.Date(row.names(df))
真是太痛苦了,所以在过去,我使用以下代码在数据框中添加了一列:
(df <- cbind(df, tim=as.Date(row.names(df))))
我现在可以将时间序列绘制为:
with(df, {
plot(tim, x1, type="l", xlab="", ylab="Test", main="Using a new tim column", col="red")
lines(tim, x2, col="blue")
lines(tim, v2, col="green")
})
此技术有效,但添加tim
列感觉很草率。是否有更好/更清洁的方法来做到这一点?
编辑1(2012-05-13)====================================
我使用数据帧的原因是因为这些数据通常被馈送到一个或多个需要数据帧的包,和/或因为我通常需要在某些变量中表示非数字数据。 / p>
答案 0 :(得分:2)
我会尽可能地坚持动物园设施:
library(xts)
x1 <- xts(rnorm(10), as.Date("2012-01-01") + 0:9)
x2 <- xts(rnorm(10), as.Date("2012-01-04") + 0:9)
dz <- merge(x1=x1, x2=x2); dz$v1=4:16; dz$v2=rnorm(13)
# keeps it a zoo object rather than a data.frame
with(dz, plot( x1, type="l", xlab="", ylab="Test", main="Not using row.names()\nStick with zoo" ) )
lines( dz$x2, col="blue")
lines( dz$v2, col="green")