我正在尝试计算以下数据的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 :(得分: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填充会更好,但是rollapply
与partial = TRUE
相比更好:
ave(mydf$TotalSessions, mydf$SiteID
, FUN = function(x) {rollapply(x, 3, median, align = "right", partial = TRUE)})