2016-07-19 26 views
2

Alle Lagbeispiele, die ich sehe, verwenden eine kontinuierliche Zeitreihe. Ich versuche eine prozentuale Veränderung pro Jahr zu berechnen, aber es wäre für mich nicht sinnvoll zu berechnen, ob es dazwischen einen Unterschied gibt. , d. H. Ich würde keine prozentuale Veränderung von 2001 bis 2004 wollen. Nur interessiert zwischen zwei Jahren. Beispiel für die Dateneingabe:Berechne die Änderung unter Verwendung der Nachlauffunktion mit Jahresfehlern in R

structure(list(ID = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L), .Label = c("A", "B"), class = "factor"), 
    Year = c(2000L, 2001L, 2004L, 2005L, 2006L, 2007L, 1990L, 
    2000L, 2001L, 2005L, 2006L, 2007L, 2009L), Value = c(4L, 
    10L, 7L, 4L, 7L, 5L, 2L, 7L, 10L, 6L, 9L, 2L, 9L)), .Names = c("ID", 
"Year", "Value"), class = "data.frame", row.names = c(NA, -13L 
)) 

df <- df %>% group_by(ID) %>% 
    mutate(delta = (Value-lag(Value))/lag(Value)) 

Die obige Zeile gibt nicht meine gewünschte Ausgabe zurück und ignoriert Orte, die springen. Wunsch Ausgabe:

structure(list(ID = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L), .Label = c("A", "B"), class = "factor"), 
    Year = c(2000L, 2001L, 2004L, 2005L, 2006L, 2007L, 1990L, 
    2000L, 2001L, 2005L, 2006L, 2007L, 2009L), Value = c(4L, 
    10L, 7L, 4L, 7L, 5L, 2L, 7L, 10L, 6L, 9L, 2L, 9L), Change = c(NA, 
    1.5, NA, -0.428571429, 0.75, -0.285714286, NA, 2.5, 0.428571429, 
    NA, 0.5, -0.777777778, NA)), .Names = c("ID", "Year", "Value", 
"Change"), class = "data.frame", row.names = c(NA, -13L)) 
+0

Wie groß ist Ihr Datenmenge zu bekommen? –

+0

Tausende von Zeilen. – hhhaaa1

Antwort

4

mit dplyr:

df %>% group_by(ID) %>% 
    mutate(delta = ifelse((Year - lag(Year)) > 1, NA, (Value-lag(Value))/lag(Value))) 
3

Hier ist eine data.table Lösung:

# load library and convert to data.table 
library(data.table) 
setDT(df) 

df[, "Change" := ifelse(Year-shift(Year)==1, 
    (Value-shift(Value))/shift(Value), NA), by="ID"] 

die

df 
    ID Year Value  Change 
1: A 2000  4   NA 
2: A 2001 10 1.5000000 
3: A 2004  7   NA 
4: A 2005  4 -0.4285714 
5: A 2006  7 0.7500000 
6: A 2007  5 -0.2857143 
7: B 1990  2   NA 
8: B 2000  7   NA 
9: B 2001 10 0.4285714 
10: B 2005  6   NA 
11: B 2006  9 0.5000000 
12: B 2007  2 -0.7777778 
13: B 2009  9   NA 

gibt diese verwendet ifelse, die mit enormen Datenmengen langsam sein kann, aber wenn die Daten Set ist in der Tausenden von Beobachtungen Größe, wird dies nicht bemerkbar sein.

3

Hier eine mögliche Lösung mit der diff Funktion.

library(dplyr) 
df <- df %>% group_by(ID) %>% 
    mutate(delta = (Value-lag(Value))/lag(Value)) 

#find the difference between each row 
yeardiff<-c(0,diff(df$Year)) 
#for any row with a difference not equal to one set to NA 
df$delta[yeardiff !=1]<-NA 
1

Wir können nur base R Funktionen verwenden, um den Ausgang

lv <- with(df, ave(Value, ID, FUN = function(x) c(NA, x[-length(x)]))) 
ly <- with(df, ave(Year, ID, FUN = function(x) c(NA, x[-length(x)]))) 
df$Change <- with(df, ifelse((Year -ly) >1, NA, (Value - lv)/lv)) 
df$Change 
#[1]   NA 1.5000000   NA -0.4285714 0.7500000 
#[6] -0.2857143   NA   NA 0.4285714   NA 
#[11] 0.5000000 -0.7777778   NA