簡體   English   中英

R:計算滾動中值和滾動平均值時出錯

[英]R: Error while calculating Rolling Median and Rolling Mean

我正在嘗試為以下數據計算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

謝謝您的幫助!

就個人而言,我會使用答案或評論中提出的解決方案之一。

這里是一個答案,通過為缺少的月份(所需的輸出)添加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

用NA填充會更好,但比用partial = TRUE rollapply填充更好:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM