2016-09-09 4 views
-2

I wie unten einen Datenrahmen haben:R dplyr - rollmean durch Spalten mit Gruppe

(Finden Sie Bild, wenn die Daten nicht als pro-Format)

Sample Data      
date id name loc mean count mean 
9/6/2016 kar1 AAA 100004 0 1 
9/8/2016 kar1 AAA 100004 0 3 
9/9/2016 kar1 AAA 100004 0 4 
9/10/2016 kar1 AAA 100004 0 5 
9/11/2016 kar1 AAA 100004 0 6 
9/12/2016 kar1 AAA 100004 0 7 
9/13/2016 kar1 AAA 100004 0 8 
9/14/2016 kar1 AAA 100004 0 9 
9/7/2016 blr1 BBB 100004 0 2 

versuchen ((7 Tage ins Rollen zu berechnen Durchschnitt) 3 Tage rollender Durchschnitt (vorheriger 3 Tag und folgender 3 Tag) auf Zählfeld basierend auf ID, Name, Lok, aber die Ergebnisse sind nicht wie erwartet.

Unten finden Sie den Code ein:

fnrollmean <- function(x) rollmean(df$count,7,na.pad=TRUE,align="center") 

rollmeandf <- df %>% group_by(id,name,loc) %>% arrange(id,name,loc) %>% mutate(funs=fnrollmean(df$count)) 

ich Fehler:

Fehler bei eval (Ersatz (expr), envir, enclos): unvereinbar Größe (9), in der Erwartung 8 (die Gruppengröße) oder 1

Wenn ich nur tun:

test2 <- df %>% mutate(funs=fnrollmean(df$count)) 

es funktioniert, aber berechnet durch die Berücksichtigung aller Krankheiten, die falsch sind.

Bitte lassen Sie mich wissen, wenn etwas oder irgendeine Arbeit fehlt.

Erwartete Ergebnisse:

date id name loc mean count mean 
9/6/2016 kar1 AAA 100004 0 1 NA 
9/8/2016 kar1 AAA 100004 0 3 NA 
9/9/2016 kar1 AAA 100004 0 4 NA 
9/10/2016 kar1 AAA 100004 0 5 4.8 
9/11/2016 kar1 AAA 100004 0 6 6 
9/12/2016 kar1 AAA 100004 0 7 NA 
9/13/2016 kar1 AAA 100004 0 8 NA 
9/14/2016 kar1 AAA 100004 0 9 NA 
9/7/2016 blr1 BBB 100004 0 2 NA 

sample data in image

Dank

+0

Ihre 'fnrollmean' Funktion benötigt das 'x' Argument zu verwenden, die übergeben wird hinein (anstelle von 'df $ count'). In Ihrem Aufruf zum 'mutieren' sollten Sie' count', nicht 'df $ count' verwenden. Aber selbst diese Änderungen führen immer noch zu einem Fehler. Ich bin nicht genug vertraut mit dem _zoo_ Paket, um weiter zu kommentieren. – jdobres

Antwort

2

mutate nutzen zu können, müssen Sie eine Fensterfunktion, die die gleiche Länge Vektor als Vektor zurückgibt (s), die eingegeben werden zu die Funktion (oder gibt einen Skalar zurück, der zu einem Vektor dieser Länge gezwungen wird, der mit dem Skalarwert gefüllt ist). Das Problem ist, dass Ihre fnrollmean nicht und daher der Fehler. Beachten Sie, dass der gleiche Fehlertyp auch nach dem Befolgen von jdobres Kommentaren mit den eingegebenen Eingabedaten erhalten bleibt, da Ihre zweite Gruppe (blr1, BBB, 100004) nur 1 Zeilen enthält. Daher ändern fnrollmean wie:

library(zoo) 
fnrollmean <- function (x) { 
    if (length(x) < 7) { 
    rep(NA,length(x)) 
    } else { 
    rollmean(x,7,align="center",na.pad=TRUE) 
    } 
} 

Bitte beachte, dass wir jdobre Kommentar zu verwenden x statt df$count innerhalb der Funktion folgt. Dann ist (wieder jdobre Kommentar der folgenden count zu verwenden, anstatt df$count wenn fnrollmean innerhalb mutate Aufruf):

library(dplyr) 
result <- df %>% group_by(id,name,loc) %>% 
       mutate(rollavg=fnrollmean(count)) 

gibt:

print(result) 
##Source: local data frame [9 x 7] 
##Groups: id, name, loc [2] 
## 
##  date  id name loc mean count rollavg 
##  <fctr> <fctr> <fctr> <int> <int> <int> <dbl> 
##1 9/6/2016 kar1 AAA 100004  0  1  NA 
##2 9/8/2016 kar1 AAA 100004  0  3  NA 
##3 9/9/2016 kar1 AAA 100004  0  4  NA 
##4 9/10/2016 kar1 AAA 100004  0  5 4.857143 
##5 9/11/2016 kar1 AAA 100004  0  6 6.000000 
##6 9/12/2016 kar1 AAA 100004  0  7  NA 
##7 9/13/2016 kar1 AAA 100004  0  8  NA 
##8 9/14/2016 kar1 AAA 100004  0  9  NA 
##9 9/7/2016 blr1 BBB 100004  0  2  NA 
+0

Danke Aichao ... es funktionierte .. – Ckeng

+0

Wenn es funktionierte, sollten Sie diese Antwort akzeptieren, damit die Leute wissen, dass die Frage beantwortet wurde. :) – Ajar

Verwandte Themen