我有以下数据框:
> head(giftByDay)
giftDate gift yr mon day
1 2009-07-01 100.00 2009 7 1
2 2009-07-03 300.00 2009 7 3
3 2009-07-06 470.00 2009 7 6
4 2009-07-07 7436.66 2009 7 7
5 2009-07-09 50.00 2009 7 9
6 2009-07-11 25.00 2009 7 11
这份数据有3年的记录(财政年度截至6月30日),我想将它们都放在一个图表中,分别以三条线展示每年的表现。另外,我还想将美元放在y轴上,日期放在x轴上。
根据年份,我将其分成了3个部分:
> yr2009 <- subset(giftByDay, giftByDay$giftDate >= "2009-07-01" & giftByDay$giftDate < "2010-07-01")
> yr2010 <- subset(giftByDay, giftByDay$giftDate >= "2010-07-01" & giftByDay$giftDate < "2011-07-01")
> yr2011 <- subset(giftByDay, giftByDay$giftDate >= "2011-07-01" & giftByDay$giftDate < "2012-07-01")
下一步,我创建了动物园对象以进行绘图:
> yr2009$d2 <- format(as.Date(yr2009$giftDate), "%m-%d")
> x1 <- zoo(yr2009$gift, yr2009$d2)
> yr2010$d2 <- format(as.Date(yr2010$giftDate), "%m-%d")
> x2 <- zoo(yr2010$gift, x2.Date)
> yr2011$d2 <- format(as.Date(yr2011$giftDate), "%m-%d")
> x3 <- zoo(yr2011$gift, x3.Date)
问题出现在尝试绘图时:
> plot(x1, type="l", col=1)
Error in plot.window(...) : need finite 'xlim' values
In addition: Warning messages:
1: In xy.coords(x, y, xlabel, ylabel, log) : NAs introduced by coercion
2: In min(x) : no non-missing arguments to min; returning Inf
3: In max(x) : no non-missing arguments to max; returning -Inf
> points(x2, type="l", col=2)
Warning message:
In xy.coords(x, y) : NAs introduced by coercion
> points(x3, type="l", col=3)
Warning message:
In xy.coords(x, y) : NAs introduced by coercion
实际上对象中有一些内容:
> head(x1)
01-01 01-04 01-05 01-08 01-11 01-13
15.0 125.0 1000.0 6350.0 200.0 291281.1
但我无法弄清楚为什么它无法绘图。有任何建议吗?
编辑:
> giftByDayList <- split(as.xts(giftByDay), "years")
Error in as.POSIXlt.character(x, tz, ...) :
character string is not in a standard unambiguous format
> class(giftByDay$giftDate)
[1] "character"
我不确定是什么原因导致了这个错误。
编辑2:
> gbd <- zoo(giftByDay)
> gbd <- as.xts(gbd)
Error in xts(coredata(x), order.by = order.by, frequency = frequency, :
order.by requires an appropriate time-based object
> giftByDayList <- split(as.xts(gbd), "years")
Error in xts(coredata(x), order.by = order.by, frequency = frequency, :
order.by requires an appropriate time-based object
编辑3:
> giftByDayList <- split(xts(giftByDay[,-1],as.Date(giftByDay$giftDate)), "years")
> giftByDayList <- lapply(giftByDayList, toyear, 2011)
Error in `index<-.xts`(`*tmp*`, value = list(sec = c(0, 0, 0, 0, 0, 0, :
unsupported ‘index’ index type of class ‘POSIXt’unsupported ‘index’ index type of class ‘POSIXlt’
> str(giftByDayList )
List of 3
$ :An ‘xts’ object from 2009-07-01 to 2009-12-31 containing:
Data: num [1:89, 1:4] 100 300 470 7437 50 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:4] "gift" "yr" "mon" "day"
Indexed by objects of class: [Date] TZ:
xts Attributes:
NULL
$ :An ‘xts’ object from 2010-01-01 to 2010-12-31 containing:
Data: num [1:213, 1:4] 15 125 1000 6350 200 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:4] "gift" "yr" "mon" "day"
Indexed by objects of class: [Date] TZ:
xts Attributes:
NULL
$ :An ‘xts’ object from 2011-01-02 to 2011-10-26 containing:
Data: num [1:189, 1:4] 1500 235 1000 18154 10 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:4] "gift" "yr" "mon" "day"
Indexed by objects of class: [Date] TZ:
xts Attributes:
NULL
>
giftByDay
是一个动物园对象。 - Joshua Ulrichc(1,2,3,...)
的动物园对象。但是,xts要求索引必须是基于时间的对象(正如错误所示)。当你遇到错误时,请使用str(gbd)
来检查对象的结构。在你的第一条评论后,我编辑了我的答案,向你展示如何将giftByDay
转换为xts对象。 - Joshua Ulrich