2017-03-30 1 views
0

Ich habe Probleme, etwas ziemlich Einfaches zu tun: Wenden Sie eine rollende Funktion (Standardabweichung) nach Gruppe in einer data.table an. Mein Problem ist, dass, wenn ich eine data.table mit rollapply by einige Spalte verwende, data.table die Beobachtungen wie in der Warnmeldung unten beschrieben recycelt. Ich möchte NAs für die Beobachtungen erhalten, die außerhalb des Fensters liegen, anstatt die Standardabweichungen zu recyceln.Wenden Sie eine Rollfunktion nach Gruppe in r an (zoo, data.table)

Das ist mein Ansatz so weit Iris verwendet, und ein Rollfenster der Größe 2, nach rechts ausgerichtet:

library(zoo) 
library(data.table) 

A <- iris 
setDT(A) 
A[,stdev := rollapply(Petal.Width, width = 2, sd, align = 'right', partial = F),by = Species] 
Warning messages: 
1: In `[.data.table`(A, , `:=`(stdeev, rollapply(Petal.Width, width = 2, : 
    Supplied 49 items to be assigned to group 1 of size 50 in column 'stdeev' (recycled leaving remainder of 1 items). 
2: In `[.data.table`(A, , `:=`(stdeev, rollapply(Petal.Width, width = 2, : 
    Supplied 49 items to be assigned to group 2 of size 50 in column 'stdeev' (recycled leaving remainder of 1 items). 
3: In `[.data.table`(A, , `:=`(stdeev, rollapply(Petal.Width, width = 2, : 
    Supplied 49 items to be assigned to group 3 of size 50 in column 'stdeev' (recycled leaving remainder of 1 items). 

> A 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species  stdeev  stdev 
    1:   5.1   3.5   1.4   0.2 setosa 0.00000000 0.00000000 
    2:   4.9   3.0   1.4   0.2 setosa 0.00000000 0.00000000 
    3:   4.7   3.2   1.3   0.2 setosa 0.00000000 0.00000000 
    4:   4.6   3.1   1.5   0.2 setosa 0.00000000 0.00000000 
    5:   5.0   3.6   1.4   0.2 setosa 0.14142136 0.14142136 
---                     
146:   6.7   3.0   5.2   2.3 virginica 0.28284271 0.28284271 
147:   6.3   2.5   5.0   1.9 virginica 0.07071068 0.07071068 
148:   6.5   3.0   5.2   2.0 virginica 0.21213203 0.21213203 
149:   6.2   3.4   5.4   2.3 virginica 0.35355339 0.35355339 
150:   5.9   3.0   5.1   1.8 virginica 0.42426407 0.42426407 

Antwort

3

hinzufügen fill=NA-rollapply. Dadurch wird sichergestellt, dass ein Vektor mit der Länge 50 (anstelle von 49) zurückgegeben wird, wobei NA als erster Wert (seit align="right") verwendet wird, um eine Wiederverwertung zu vermeiden.

A[,stdev := rollapply(Petal.Width, width=2, sd, align='right', partial=F, fill=NA), by=Species] 
Sepal.Length Sepal.Width Petal.Length Petal.Width Species  stdev 
1   5.1   3.5   1.4   0.2  setosa   NA 
2   4.9   3.0   1.4   0.2  setosa 0.00000000 
3   4.7   3.2   1.3   0.2  setosa 0.00000000 
... 
51   7.0   3.2   4.7   1.4 versicolor   NA 
52   6.4   3.2   4.5   1.5 versicolor 0.07071068 
53   6.9   3.1   4.9   1.5 versicolor 0.00000000 
... 
101   6.3   3.3   6.0   2.5 virginica   NA 
102   5.8   2.7   5.1   1.9 virginica 0.42426407 
103   7.1   3.0   5.9   2.1 virginica 0.14142136 
+0

danke! Was stimmt wirklich überein? Ich dachte, es fängt an, das Fenster von links zu zählen, also hätte ich zwei NA vor dem ersten Wert erwartet. – dleal

+0

Wenn Sie rechts ausrichten, wird der erste rollende Wert am rechten Ende des Fensters platziert, sodass eine Fensterlänge von zwei ergibt NA für den ersten Wert. Links ausrichten ergibt NA für den letzten Wert. – eipi10

+0

also, wenn es Breite 3 war, und nach rechts ausrichten, würde ich zwei NAs vor dem ersten Wert sehen? – dleal

Verwandte Themen