2016-07-03 7 views
-1

Ich möchte eine neue Spalte nach Namen gruppiert wie folgt erstellen:Wie berechne ich eine neue Spalte basierend auf dem Verhältnis zwischen der aktuellen und der vorherigen Zeile mit der Bibliothek (dplyr) in den Panel-Daten?

library(dplyr) 

dates <- as.Date(as.character(c("2011-01-13", 
          "2011-01-14", 
          "2011-01-15", 
          "2011-01-16", 
          "2011-01-17", 
          "2011-01-13", 
          "2011-01-14", 
          "2011-01-15", 
          "2011-01-16", 
          "2011-01-17", 
          "2011-01-13", 
          "2011-01-14", 
          "2011-01-15", 
          "2011-01-16", 
          "2011-01-17"))) 

Name <-c("Andy","Andy","Andy","Andy","Andy","Jo","Jo","Jo","Jo","Jo","Me","Me","Me","Me",'Me') 
contribution<- c(2,3,2,2,3,4,5,10,4,10,1,2,4,1,5) 
# put together 
data <- data.frame(Name, dates, contribution) 

    Name  dates contribution 
#1 Andy 2011-01-13   2 
#2 Andy 2011-01-14   3 
#3 Andy 2011-01-15   2 
#4 Andy 2011-01-16   2 
#5 Andy 2011-01-17   3 
#6 Jo 2011-01-13   4 
#7 Jo 2011-01-14   5 
#8 Jo 2011-01-15   10 
#9 Jo 2011-01-16   4 
#10 Jo 2011-01-17   10 
#11 Me 2011-01-13   1 
#12 Me 2011-01-14   2 
#13 Me 2011-01-15   4 
#14 Me 2011-01-16   1 
#15 Me 2011-01-17   5 

(Beitrag - Verzögerung (Beitrag))/1 + Verzögerung (Beitrag): nur Strom ist

wo lag() row - 1

(3-2)/1 + 2 = 1/3 = 0,333

Was ich versucht:

data %>% group_by(Name) %>% mutate(change = (contribution-lag(contribution)/1+lag(contribution))) 

    Name  dates contribution change 
#1 Andy 2011-01-13   2  NA 
#2 Andy 2011-01-14   3  3 
#3 Andy 2011-01-15   2  2 
#4 Andy 2011-01-16   2  2 
#5 Andy 2011-01-17   3  3 
#6  Jo 2011-01-13   4  NA 
#7  Jo 2011-01-14   5  5 
#8  Jo 2011-01-15   10  10 
#9  Jo 2011-01-16   4  4 
#10  Jo 2011-01-17   10  10 
#11  Me 2011-01-13   1  NA 
#12  Me 2011-01-14   2  2 
#13  Me 2011-01-15   4  4 
#14  Me 2011-01-16   1  1 
#15  Me 2011-01-17   5  5 

Antwort

1

Wir müssen Klammern um verwenden 1+lag(contribution)

data %>% 
    group_by(Name) %>% 
    mutate(change = (contribution - lag(contribution))/(1+ lag(contribution))) 
# Name  dates contribution  new 
# <fctr>  <date>  <dbl>  <dbl> 
#1 Andy 2011-01-13   2   NA 
#2 Andy 2011-01-14   3 0.3333333 
#3 Andy 2011-01-15   2 -0.2500000 
#4 Andy 2011-01-16   2 0.0000000 
#5 Andy 2011-01-17   3 0.3333333 
#6  Jo 2011-01-13   4   NA 
#7  Jo 2011-01-14   5 0.2000000 
#8  Jo 2011-01-15   10 0.8333333 
#9  Jo 2011-01-16   4 -0.5454545 
#10  Jo 2011-01-17   10 1.2000000 
#11  Me 2011-01-13   1   NA 
#12  Me 2011-01-14   2 0.5000000 
#13  Me 2011-01-15   4 0.6666667 
#14  Me 2011-01-16   1 -0.6000000 
#15  Me 2011-01-17   5 2.0000000 
+0

Warum ist es downvoted? – akrun

Verwandte Themen