2016-08-08 11 views
2

I data.frame haben, die wie folgt aussieht:ddply Transformation (Veränderung in Prozent) in R

Brand  Year  EUR 
Brand1  2015  10 
Brand1  2016  20 
Brand2  2015  100 
Brand2  2016  500 
Brand3  2015  25 
Brand4  2015  455 
... 

Auch lege ich den Code unten:

library(plyr) 
library(dplyr) 
library(scales) 

set.seed(1992) 
n=68 

Year <- sample(c("2015", "2016"), n, replace = TRUE, prob = NULL) 
Brand <- sample("Brand", n, replace = TRUE, prob = NULL) 
Brand <- paste0(Brand, sample(1:5, n, replace = TRUE, prob = NULL)) 
EUR <- abs(rnorm(n))*100000 

df <- data.frame(Year, Brand, EUR) 

ich einige zusätzliche Datentransformationen benötigen (fügen Sie mehr Spalten) für meine zukünftige Forschung.

Zunächst berechne ich Positionen für Etiketten (für meine Zukunft Grafik) und nenne es pos:

df.summary = df %>% group_by(Brand, Year) %>% 
    summarise(EUR = sum(EUR)) %>% # 
    mutate(pos = cumsum(EUR)-0.5*EUR) 

Was will ich zu tun ist, für jeden Brand in Bezug auf Year berechnen percentage grow. Also füge ich diese Zeile hinzu:

Aber was ich bekomme, ist konstante Größe - Wachstum aller meiner Datenrahmen.

Könnten Sie mir bitte helfen, prozentuale Änderungen für jede Marke zu berechnen?

Danke!

+0

Können Sie einige erwartete Ausgabe zur Verfügung stellen? (Tatsächliche Werte des Wachstums.) Es hilft zu überprüfen, ob wir den richtigen Weg berechnen. – r2evans

+2

Wahrscheinlich sind Ihre Probleme durch das Mischen von 'dplyr' und' plyr' entstanden. Hast du vielleicht 'plyr' nach' dplyr' geladen und ignorierst die Warnungen, die dir sagen, dass du das nicht tust? Es wird dazu führen, dass 'plyr'-Funktionen ihre' dplyr'-Versionen maskieren und zu Fehlern führen. Warum nicht einfach 'dplyr' verwenden? – Gregor

+0

Zum Beispiel: Marke Jahr EUR Marke1 2015 500 Marke1 2016 1500 So ist mein Ziel, das Ergebnis zu erhalten: ((1500/500) -1) * 100% = 200% So bedeutet es, dass Marke1 gestiegen sein Geldbetrag im Jahr 2016 um 200% im Vergleich zu 2015 – AK47

Antwort

4

Auch wäre es einfacher, wenn Sie lag verwenden:

df.summary %>% group_by(Brand) %>% 
     mutate(pChange = (EUR - lag(EUR))/lag(EUR) * 100) 

# Source: local data frame [10 x 5] 
#Groups: Brand [5] 
# 
# Brand Year  EUR  pos pChange 
# <fctr> <fctr> <dbl> <dbl>  <dbl> 
#1 Brand1 2015 637896.7 318948.3  NA 
#2 Brand1 2016 721944.2 998868.8 13.17573 
#3 Brand2 2015 708697.6 354348.8  NA 
#4 Brand2 2016 300541.1 858968.2 -57.59248 
#5 Brand3 2015 454890.1 227445.1  NA 
#6 Brand3 2016 576095.6 742937.9 26.64500 
#7 Brand4 2015 305712.0 152856.0  NA 
#8 Brand4 2016 174073.3 392748.6 -43.05970 
#9 Brand5 2015 589970.7 294985.3  NA 
#10 Brand5 2016 518510.2 849225.8 -12.11254 

Wie @ r2evans vorgeschlagen, wenn die Year vorher nicht angeordnet ist,

df.summary %>% group_by(Brand) %>% arrange(Year) %>% 
      mutate(pChange = (EUR - lag(EUR))/lag(EUR) * 100) 
+1

Ich schlage vor, Sie fügen 'arrangieren (Jahr) ', es sei denn OP ist garantiert, dass alle Daten im Voraus perfekt bestellt werden. (Auch zu OP, wenn er vor Löchern in Daten schützen muss, z. B. fehlende 'Year's.) – r2evans

+0

Vielen Dank für schnelle Antwort! – AK47

+0

Gibt es eine Möglichkeit, es ohne "Lag" -Operator zu berechnen? In anderen Fällen habe ich keine numerischen Variablen. – AK47