R:计算Rolling Median和Rolling Mean时出错

时间:2015-01-08 22:43:36

标签: r

我正在尝试计算以下数据的3期滚动平均值和滚动中位数:

SiteID    Month   TotalSessions TotalMinutes
  1       201401    132            1334
  1       201402    159            2498
  1       201403     98             734
  1       201404    112             909     
  2       201402     25             220
  2       201404     32             407
  4       201401     10              77
  4       201402     12             112
  4       201403      9              59

但是当我使用以下功能时,我得到了一个:

ave(mydf$TotalSessions, mydf$SiteID, FUN = function(x) rollmedian(x,k=3, align = "right", na.pad = T))

错误:k< = n不为TRUE

我理解错误是因为对于某些SiteID而言,数据的周期少于3个,因此滚动中位数无法计算。

我的问题是,有没有办法可以在TotalSessions和Total Minutes中添加0的缺失月份,以便数据看起来如下:

 SiteID    Month   TotalSessions TotalMinutes
  1       201401    132            1334
  1       201402    159            2498
  1       201403     98             734
  1       201404    112             909
  2       201401      0               0
  2       201402     25             220     
  2       201403      0               0
  2       201404     32             407
  4       201401     10              77
  4       201402     12             112
  4       201403      9              59
  4       201404      0               0

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

我个人会使用答案或评论中提出的解决方案之一。

这里是一个答案,通过为缺失的月份(所需的输出)添加0来修改数据。我主要使用merge函数。

xx <-  data.frame(Month=unique(dat$Month))
res <- do.call(rbind,
         by(dat,dat$SiteID,function(x)merge(x,xx,all.y=TRUE)))
res[is.na(res)] <- 0

#      Month SiteID TotalSessions TotalMinutes
# 1.1 201401      1           132         1334
# 1.2 201402      1           159         2498
# 1.3 201403      1            98          734
# 1.4 201404      1           112          909
# 2.1 201401      0             0            0
# 2.2 201402      2            25          220
# 2.3 201403      0             0            0
# 2.4 201404      2            32          407
# 4.1 201401      4            10           77
# 4.2 201402      4            12          112
# 4.3 201403      4             9           59
# 4.4 201404      0             0            0

答案 1 :(得分:3)

使用NAs填充会更好,但是rollapplypartial = TRUE相比更好:

ave(mydf$TotalSessions, mydf$SiteID
    , FUN = function(x) {rollapply(x, 3, median, align = "right", partial = TRUE)})