2016-03-14 23 views
5

Eğer bu cevap verildiyse özür dileriz. Bugün çok sayıda örnek gördüm, ama yapmaya çalıştığım bu eşleşmeyi bulamıyorum.Çoklu sütunlarda ortalamaları taşıma - Gruplandırılmış Veriler

I üzerinde 3 noktalı hareketli ortalamasını hesaplamak gerekir, bir veri seti vardır.

set.seed(1234) 
data.frame(Week = rep(seq(1:5), 3), 
Section = c(rep("a", 5), rep("b", 5), rep("c", 5)), 
Qty = runif(15, min = 100, max = 500), 
To = runif(15, min = 40, max = 80)) 

Ben 'Miktar' her ikisi için 'Section' sütunu ve 'Kime' sütunlarında dayalı olarak her grup için MA hesaplamak istiyorum: Aşağıda bazı kukla veri oluşturduk. İdeal olarak çıktı, bir veri tablosu olacaktır. Hareketli ortalama, 3. Haftada başlayacaktı, bu yüzden 1: 3

'un ortalaması olacaktır. Veri paketlenebilir bir paket üzerinde uzmanlaşmaya çalışıyorum, bu da büyük bir çözümün kullanılmasını sağlamaya çalışacaktır, ancak aksi takdirde çok takdir edilecektir.

Sadece başvuru için benim gerçek veri seti yaklaşık olacaktır. Toplamda c.1M satırları olan 70 bölüm. Data.table'ı şu ana kadar bu tür hacimlerde çatırdama yapmak için son derece hızlı buldum.

+0

bakınız [buradan] (http://stackoverflow.com/questions/32649913/calculating-sum-of-previous-3-rows-in- r-data-tablo-by-grid-square /) bazı daha fazla seçenek için –

cevap

5

zoo paketinden rollmean paketini data.table ile birlikte kullanabiliriz.

library(data.table) 
library(zoo) 
setDT(df)[, c("Qty.mean","To.mean") := lapply(.SD, rollmean, k = 3, fill = NA, align = "right"), 
       .SDcols = c("Qty","To"), by = Section] 
> df 
# Week Section  Qty  To Qty.mean To.mean 
#1: 1  a 145.4814 73.49183  NA  NA 
#2: 2  a 348.9198 51.44893  NA  NA 
#3: 3  a 343.7099 50.67283 279.3703 58.53786 
#4: 4  a 349.3518 47.46891 347.3271 49.86356 
#5: 5  a 444.3662 49.28904 379.1426 49.14359 
#6: 1  b 356.1242 52.66450  NA  NA 
#7: 2  b 103.7983 52.10773  NA  NA 
#8: 3  b 193.0202 46.36184 217.6476 50.37802 
#9: 4  b 366.4335 41.59984 221.0840 46.68980 
#10: 5  b 305.7005 48.75198 288.3847 45.57122 
#11: 1  c 377.4365 72.42394  NA  NA 
#12: 2  c 317.9899 61.02790  NA  NA 
#13: 3  c 213.0934 76.58633 302.8400 70.01272 
#14: 4  c 469.3734 73.25380 333.4856 70.28934 
#15: 5  c 216.9263 41.83081 299.7977 63.89031 
+0

OP ile aynı tohumu kullandınız mı? – agenis

+0

@mtoto Hızlı cevap için teşekkürler, tam olarak ihtiyacım olan şey bu! – MidnightDataGeek

+0

@agenis haklısınız, yanıt güncellendi. – mtoto

1

çözeltisi dplyr kullanılarak:

library(dplyr); library(zoo) 
myfun = function(x) rollmean(x, k = 3, fill = NA, align = "right") 
df %>% group_by(Section) %>% mutate_each(funs(myfun), Qty, To) 
#### Week Section  Qty  To 
#### (int) (fctr) (dbl) (dbl) 
#### 1  1  a  NA  NA 
#### 2  2  a  NA  NA 
#### 3  3  a 279.3703 58.53786 
#### 4  4  a 347.3271 49.86356 
+0

Teşekkürler! Aynı sorunu birden çok şekilde nasıl çözebileceğinizi görmek güzel. – MidnightDataGeek