【问题标题】:R zoo plot multiple years of data overlappingR动物园绘制多年的数据重叠
【发布时间】:2011-12-17 08:51:10
【问题描述】:

我有以下df:

> 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 日),我试图将所有 3 个数据放在一个图中作为 3 条单独的线来比较年同比表现。此外,我试图将美元放在 y 轴上,将 MM-DD 放在 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
> 

【问题讨论】:

    标签: r xts zoo


    【解决方案1】:

    1) data.frame 解决方案。尝试这个。我们设置了一些测试数据,然后计算会计年度并重新设置转换语句中的每个日期。最后,我们按财政年度绘制礼物与重定日期。请注意,它实际上只有两条语句,一条用于转换,一条用于绘图。

    ## set up test data
    
    giftDate <- seq(as.Date("2009-07-01"), length = 36, by = "month")
    giftByDay <- data.frame(giftDate, gift = 1:36,
        yr = as.numeric(format(giftDate, "%Y")),
        mon = as.numeric(format(giftDate, "%m")),
        day = as.numeric(format(giftDate, "%d")))
    
    ## now that we have test data, calculate fiscalyear, rebase each date to 1999-2000
    ## and plot
    
    giftByDay <- transform(giftByDay, fiscalyear = yr + (mon > 6),
        Date = as.Date(paste(2000 - (mon > 6), mon, day, sep = "-")))
    
    library(lattice)
    xyplot(gift ~ Date,  giftByDay, group = fiscalyear, type = "o", auto.key = TRUE)
    

    编辑:

    在下方添加了动物园解决方案。

    2) 动物园解决方案。在这种情况下,解决方案并不比仅使用数据框更简单,尽管如果 z 的特定形式可用于其他计算,它可能会有优势:

    library(zoo)
    library(lattice)
    
    giftByDay <- transform(giftByDay, fiscalyear = yr + (mon > 6))
    
    z <- read.zoo(giftByDay[2:6], index = 2:4, split = 5, FUN = function(y, m, d)
            as.Date(paste(2000 - (m > 6), m, d, sep = "-")))
    xyplot(z, screen = 1, col = 1:3, type = "o", auto.key = TRUE, ylab = "Gift")
    

    这是动物园对象z 的样子:

    > z
               2010 2011 2012
    1999-07-01    1   13   25
    1999-08-01    2   14   26
    1999-09-01    3   15   27
    1999-10-01    4   16   28
    1999-11-01    5   17   29
    1999-12-01    6   18   30
    2000-01-01    7   19   31
    2000-02-01    8   20   32
    2000-03-01    9   21   33
    2000-04-01   10   22   34
    2000-05-01   11   23   35
    2000-06-01   12   24   36
    

    【讨论】:

      【解决方案2】:

      这个答案是我在 R-help 上对Related to xts/time-series and plot questions... 的回答的修改版本。

      您可以通过将每个索引值转换为具有相同年份来做到这一点。下面的toyear 函数就是这样做的。

      toyear <- function(x, year) {
        # get year of last obs
        xyear <- .indexyear(last(x))+1900
        # get index and convert to POSIXlt
        ind <- as.POSIXlt(index(x))
        # set index year to desired value
        ind$year <- year-1900
        index(x) <- ind
        # label column with year of last obs
        colnames(x) <- paste(colnames(x),xyear,sep=".")
        x
      }
      
      # split data into a list of xts objects by year
      giftByDayList <- split(xts(giftByDay[,-1],as.Date(giftByDay$giftDate)), "years")
      # convert each list element to be "2011"
      giftByDayList <- lapply(giftByDayList, toyear, 2011)
      # merge all list elements into one object
      giftByDayByYear <- as.zoo(do.call(merge, giftByDayList))
      # plot on one "screen"
      plot(giftByDayByYear, screens=1, col=rainbow(ncol(giftByDayByYear)))
      

      【讨论】:

      • 我无法运行代码,请参阅上面的 EDIT 错误消息。
      • @acesnap:对不起,我以为giftByDay 是一个动物园对象。
      • @acesnap:您创建了一个索引为c(1,2,3,...) 的动物园对象。 xts 要求索引是基于时间的对象(如错误所述)。遇到错误时使用str(gbd) 检查对象的结构。在您发表第一条评论后,我编辑了我的答案,向您展示如何将 giftByDay 转换为 xts 对象。
      • 代码对我有用。我怀疑您正在运行旧版本的 xts/zoo 或 R。
      • 好的,我会检查更新,非常感谢您的帮助。
      猜你喜欢
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-04
      • 1970-01-01
      • 2014-04-21
      • 2018-01-07
      相关资源
      最近更新 更多