我需要計算涉及條件的數據框中列的滾動行總和。我所擁有的數據對「sku」有多個觀察值。我想要的是爲每個「sku」值計算5個連續行的總和。如果我達到了一個我沒有連續觀察5次「sku」的階段,我們將總結剩餘的行觀察值。在R中有效計算滾動行總和
對於說明性示例考慮以下的數據幀:
data <- structure(list(sku = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L), tf = c(50.79, 46.39, 47.85, 45.79, 44.46, 49.99,
46.12, 44.4, 41.21, 53.7, 53.9, 44.91, 59.64, 41.96, 52.26, 43.48,
46.93, 51.2, 54.31, 42.5, 47.2, 57.54, 63.23, 48.98, 52.38, 59.9,
53.01, 50.35, 41.86, 46.42)), .Names = c("sku", "tf"), row.names = c(NA,
-30L), class = "data.frame")
在該數據幀中,我們要總結的變量「TF」針對每個「SKU」值的5個軋製值。
我們已經能夠完成,使用下面的代碼:
data[,c("day_5")]<-unlist(mapply(function(y){
end1<-(which(data$sku==unique(data$sku)[y]))[length(which(data$sku==unique(data$sku)[y]))]
start<-(which(data$sku==unique(data$sku)[y]))[1]
d<-data$tf[start:end1]
r<-mapply(function(x){if (x+4 <= length(d)) {sum(d[x:(x+4)])} else {sum(d[x:length(d)])}},1:length(d))
},1:length(unique(data$sku))))
列「day_5」給我們正是我們想要的,但是這種方法被證明是非常低效的,因爲我們必須在運行此操作數以百萬計的「sku」值的數據行。
有人可以幫助我們優化此代碼,我們可以將它擴展爲大數據嗎?
'zoo'包有許多滾動功能,包括'rollsum' – Justin