2016-07-13 10 views
-1

Ich versuche, eine 7-Tage-Lag Differenz nach Gruppe erstellt. Also versuche ich, den Code unten zu replizieren und hoffe, ein ähnliches Ergebnis mit einer Verzögerung von 7 Tagen zu erhalten.differenzieren nach Gruppe mit dplyr mutieren

library(dplyr) 

dat %>% mutate(dx=c(NA, diff(x)), dy=c(NA, diff(y))) 

    x y dx dy 
1 5 3 NA NA 
2 8 9 3 6 
3 3 1 -5 -8 
4 1 5 -2 4 

Aber ich erhalte die Fehlermeldungen:

Error: incompatible size (900), expecting 905 (the group size) or 1

gibt es eine schnelle und einfache Möglichkeit, diesen Fehler zu beheben. Ich nehme an, es könnte mit muate zu tun haben

+0

Bitte zeigen Sie Ihre Eingabe Beispiel. Basierend auf der Ausgabe gibt es kein 'colname1, colname2' – akrun

+0

Bitte lesen Sie die Informationen über [wie man eine gute Frage stellt] (http://stackoverflow.com/help/how-to-ask) und wie man eine [ reproduzierbares Beispiel] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610). Dies wird es anderen sehr erleichtern, Ihnen zu helfen. – Jaap

+0

danke für den Kommentar. Der einzige Unterschied zwischen meinem Code und dem obigen ist der group_by. also dat%>% group_by (alles)%>% mutieren (dx = c (NA, diff (x)), dy = c (NA, diff (y))). Ich weiß, dass es eine einfache Lösung ist, ich weiß einfach nicht, wie ich es beheben kann, da ich ziemlich neu bin. –

Antwort

3

Sie müssen mit NA für die Anzahl der Tage in Ihrem Lag auffüllen. Genau wie Sie brauchen 1 NA für den fehlenden Differenzwert für die erste Zeile mit einer Verzögerung von 1 zu füllen, müssen Sie jetzt 7 NA für den fehlenden Differenzwert für die ersten 7 Zeilen auffüllen. Beispiel mit eingebautem in mtcars Datenrahmen:

mtcars %>% 
    mutate(dx = c(NA, diff(mpg)), 
     dx7 = c(rep(NA,7), diff(mpg, 7))) 

Oder mit der Gruppierung:

mtcars %>% 
    group_by(am) %>% 
    mutate(dx = c(NA, diff(mpg)), 
     dx7 = c(rep(NA,7), diff(mpg, 7))) 

@ Axeman die nette Antwort erinnerte mich, dass Sie auch die Version von diff des zoo Paket verwenden können, die in gebaut Polsterung. Sie müssen nur Ihr Vektor zu einem zoo Objekt konvertieren, so dass die diff.zoo Methode versandt wird erhalten, statt Basis R diff, so dass na.pad verfügbar:

library(zoo) 

mtcars %>% 
    mutate(dx = diff(zoo(mpg), na.pad=TRUE), 
     dx7 = diff(zoo(mpg), 7, na.pad=TRUE)) 
+0

Oh mein Gott! ich danke dir sehr. Es funktionierte! –

1

Ich würde ganz die diff empfehlen loszuwerden, und verwenden Sie dplyr s eigene lag. Dies erledigt die benötigten NA's.

mtcars %>% 
    mutate(dx = mpg - lag(mpg), 
     dx7 = mpg - lag(mpg, 7)) 
+1

Nun, Sie gewinnen bei Code Golf! – eipi10

+1

Nun, ich habe im letzten Jahr ziemlich viel von Ihren Antworten gelernt. – Axeman

+1

Danke! Das ist gut zu wissen. – eipi10