2016-03-14 4 views
5

Scusa se è stata fornita una risposta. Ho visto numerosi esempi oggi, ma non riesco a trovare quelli che corrispondono a quello che sto cercando di fare.Medie mobili su più colonne - Dati raggruppati

Ho un set di dati di cui ho bisogno per calcolare una media mobile a 3 punti. Ho generato alcuni dati fittizi di seguito:

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)) 

voglio calcolare la MA per ogni gruppo in base alla colonna 'sezione' sia per il 'Quantità' e 'A' colonne. Idealmente l'output sarebbe una tabella di dati. La media mobile inizierebbe alla settimana 3, quindi sarebbe la media di wks 1: 3

Sto provando a padroneggiare il pacchetto data.table in modo che una soluzione che usa sarebbe ottima ma altrimenti sarà molto apprezzata.

Solo per riferimento il mio attuale set di dati avrà ca. 70 sezioni con righe di c.1 in totale. Ho trovato data.table per essere estremamente veloce a scricchiolare questo tipo di volumi finora.

+0

Vedi anche [qui] (http://stackoverflow.com/questions/32649913/calculating-sum-of-previous-3-rows-in- r-data-table-by-grid-square /) per alcune altre opzioni –

risposta

5

Potremmo utilizzare rollmean dal pacchetto zoo, in combinazione con data.table.

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

hai usato lo stesso seme dell'OP? – agenis

+0

@mtoto grazie per la rapida risposta, è esattamente quello di cui avevo bisogno !! – MidnightDataGeek

+0

@agenis hai ragione, rispondi aggiornato. – mtoto

1

Una soluzione con dplyr:

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

grazie! È bello vedere come puoi risolvere lo stesso problema in più modi. – MidnightDataGeek