2016-06-06 3 views
0

Ich habe ein Datenrahmen mydata genannt, und ich möchte ein Roll Median für Lags 2 bis 9. Zur Zeit hinzuzufügen ich mit dem Code unten bin mit rollmedianr:können Sie Rollmedian mit gleicher Länge k verwenden?

library(data.table) 
library(zoo) 
library(TTR) 
date = seq(as.Date("2016-01-01"),as.Date("2016-01-10"),"day") 
value =c(1,2,3,4,5,6,7,8,9,10) 
mydata = data.frame (date, value) 
mydata 
setDT(mydata)[, paste0('MED',2:9) := lapply(2:9, function(x) rollmedianr(value, x, fill = rep(NA,x-1))),][] 

     date value MED2 MED3 MED4 MED5 MED6 MED7 MED8 MED9 
1: 2016-01-01  1 NA NA NA NA NA NA NA NA 
2: 2016-01-02  2 2 NA NA NA NA NA NA NA 
3: 2016-01-03  3 3 2 NA NA NA NA NA NA 
4: 2016-01-04  4 4 3 3 NA NA NA NA NA 
5: 2016-01-05  5 5 4 4 3 NA NA NA NA 
6: 2016-01-06  6 6 5 5 4 4 NA NA NA 
7: 2016-01-07  7 7 6 6 5 5 4 NA NA 
8: 2016-01-08  8 8 7 7 6 6 5 5 NA 
9: 2016-01-09  9 9 8 8 7 7 6 6 5 
10: 2016-01-10 10 2 9 3 8 4 7 5 6 

Aber in der Beschreibung des rollmedianr () Funktion "k" muss ungerade sein, damit die Ergebnisse nicht korrekt sind. Sie können sehen, MED4 in Zeile 4 zeigt "3", aber das sollte der Median des Medians (c (1,2,3,4)) sein, die 2,5 ist. Ich möchte den richtigen Rollmedian für gerade und ungerade "k" berechnen.

Ich dachte, das funktionieren könnte:

setDT(mydata)[, paste0('Calc',2:9) := lapply(2:9, function(x) rollapply(value,x,FUN="median",align="left"))][] 

aber es ist falsch, wie Sie unten sehen können. "Calc2" sollte NA, 1,5,2 usw. sein ......

  date value Calc2 Calc3 Calc4 Calc5 Calc6 Calc7 Calc8 Calc9 
1: 2016-01-01  1 1.5  2 2.5  3 3.5  4 4.5  5 
2: 2016-01-02  2 2.5  3 3.5  4 4.5  5 5.5  6 
3: 2016-01-03  3 3.5  4 4.5  5 5.5  6 6.5  5 
4: 2016-01-04  4 4.5  5 5.5  6 6.5  7 4.5  6 
5: 2016-01-05  5 5.5  6 6.5  7 7.5  4 5.5  5 
6: 2016-01-06  6 6.5  7 7.5  8 3.5  5 6.5  6 
7: 2016-01-07  7 7.5  8 8.5  3 4.5  6 4.5  5 
8: 2016-01-08  8 8.5  9 2.5  4 5.5  7 5.5  6 
9: 2016-01-09  9 9.5  2 3.5  5 6.5  4 6.5  5 
10: 2016-01-10 10 1.5  3 4.5  6 7.5  5 4.5  6 
Warning messages: 
1: In `[.data.table`(setDT(mydata), , `:=`(paste0("Calc", 2:9), lapply(2:9, : 
    Supplied 9 items to be assigned to 10 items of column 'Calc2' (recycled leaving remainder of 1 items). 
2: In `[.data.table`(setDT(mydata), , `:=`(paste0("Calc", 2:9), lapply(2:9, : 
    Supplied 8 items to be assigned to 10 items of column 'Calc3' (recycled leaving remainder of 2 items). 
3: In `[.data.table`(setDT(mydata), , `:=`(paste0("Calc", 2:9), lapply(2:9, : 
    Supplied 7 items to be assigned to 10 items of column 'Calc4' (recycled leaving remainder of 3 items). 
4: In `[.data.table`(setDT(mydata), , `:=`(paste0("Calc", 2:9), lapply(2:9, : 
    Supplied 6 items to be assigned to 10 items of column 'Calc5' (recycled leaving remainder of 4 items). 
5: In `[.data.table`(setDT(mydata), , `:=`(paste0("Calc", 2:9), lapply(2:9, : 
    Supplied 4 items to be assigned to 10 items of column 'Calc7' (recycled leaving remainder of 2 items). 
6: In `[.data.table`(setDT(mydata), , `:=`(paste0("Calc", 2:9), lapply(2:9, : 
    Supplied 3 items to be assigned to 10 items of column 'Calc8' (recycled leaving remainder of 1 items). 

Irgendwelche Gedanken? Vielen Dank.

Antwort

0

Die Frage sagt eigentlich nicht, welches Ergebnis gewünscht wird, aber vielleicht ist es das, was Sie wollen. (Wenn Sie links Ausrichtung wollen rollapply dann anstelle von rollapplyr und füge align="left" - man kann nicht sagen, da ein Beispiel in der Frage richtige Ausrichtung verwendet und eine andere links Verwendungen.)

setDT(mydata)[, paste0('MED',2:9) := 
       lapply(2:9, rollapplyr, data = value, median, fill = NA),][] 

geben:

  date value MED2 MED3 MED4 MED5 MED6 MED7 MED8 MED9 
1: 2016-01-01  1 NA NA NA NA NA NA NA NA 
2: 2016-01-02  2 1.5 NA NA NA NA NA NA NA 
3: 2016-01-03  3 2.5 2 NA NA NA NA NA NA 
4: 2016-01-04  4 3.5 3 2.5 NA NA NA NA NA 
5: 2016-01-05  5 4.5 4 3.5 3 NA NA NA NA 
6: 2016-01-06  6 5.5 5 4.5 4 3.5 NA NA NA 
7: 2016-01-07  7 6.5 6 5.5 5 4.5 4 NA NA 
8: 2016-01-08  8 7.5 7 6.5 6 5.5 5 4.5 NA 
9: 2016-01-09  9 8.5 8 7.5 7 6.5 6 5.5 5 
10: 2016-01-10 10 9.5 9 8.5 8 7.5 7 6.5 6 
Verwandte Themen