2016-07-24 30 views
1

Ich möchte Lag-Variablen für meine monatlichen Panel-Daten erstellen. Mein Beispieldatensatz sieht wie folgt aus.Wie wird die Lag-Variable in den Panel-Daten Jahr_Monat generiert?

Time ID Value1 
Jan-14 A  12 
Feb-14 A  14 
Mar-14 A  15 
Apr-14 A  18 
May-14 A  10 
Jun-14 A  12 
Jul-14 A  13 
Aug-14 A  14 
Jan-14 B  32 
Feb-14 B  14 
Mar-14 B  15 
Apr-14 B  18 
May-14 B  20 
Jun-14 B  12 
Jul-14 B  13 
Aug-14 B  14 

Ich möchte 2 neue Lag-1 und Lag-1 Variablen für jede ID erstellen. Ich habe etwas wie unten getan, aber es dauert nur für die ID korrekt: A und Rest der IDs nehmen Verzögerung der vorherigen ID.

library(zoo) 
library(plm) 
df["Time1"] <- as.yearmon(df$Time,format="%b-%y") 
pdf1 <-pdata.frame(df,index=c("ID","Time1")) 
pdf1$lag1_Value1<-lag((pdf1$Value1), 1) 

Aber ich brauche idealerweise meine Ausgabe wie unten.

Time ID Value1 lag1.Value1 lag2_Value1 
Jan-14 A  12   NA   NA 
Feb-14 A  14   12   NA 
Mar-14 A  15   14   12 
Apr-14 A  18   15   14 
May-14 A  10   18   15 
Jun-14 A  12   10   18 
Jul-14 A  13   12   10 
Aug-14 A  14   13   12 
Jan-14 B  32   NA   NA 
Feb-14 B  14   32   NA 
Mar-14 B  15   14   32 
Apr-14 B  18   15   14 
May-14 B  20   18   15 
Jun-14 B  12   20   18 
Jul-14 B  13   12   20 
Aug-14 B  14   13   12 

Mein Beispieldatensatz ist in den folgenden Codes angegeben.

df=structure(list(Time = structure(c(4L, 3L, 7L, 1L, 8L, 6L, 5L, 
2L, 4L, 3L, 7L, 1L, 8L, 6L, 5L, 2L), .Label = c("Apr-14", "Aug-14", 
"Feb-14", "Jan-14", "Jul-14", "Jun-14", "Mar-14", "May-14"), class ="factor"), 
ID = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L), .Label = c("A", "B"), class = "factor"), 
Value1 = c(12L, 14L, 15L, 18L, 10L, 12L, 13L, 14L, 32L, 14L, 
15L, 18L, 20L, 12L, 13L, 14L), Time1 = structure(c(2014, 
2014.08333333333, 2014.16666666667, 2014.25, 2014.33333333333, 
2014.41666666667, 2014.5, 2014.58333333333, 2014, 2014.08333333333, 
2014.16666666667, 2014.25, 2014.33333333333, 2014.41666666667, 
2014.5, 2014.58333333333), class = "yearmon")), row.names = c(NA, 
-16L), .Names = c("Time", "ID", "Value1", "Time1"), class = "data.frame") 

Danke für jede Hilfe.

Antwort

0

Mit dplyr:

library(dplyr) 
df %>% group_by(ID) %>% 
    mutate(lag1.Value1 = lag(Value1), lag2_Value1 = lag(lag1.Value1)) 

Ausgabe

Source: local data frame [16 x 6] 
Groups: ID [2] 

#  Time  ID Value1 Time1 lag1.Value1 lag2_Value1 
# <fctr> <fctr> <int> <dbl>  <int>  <int> 
#1 Jan-14  A  12 2014.000   NA   NA 
#2 Feb-14  A  14 2014.083   12   NA 
#3 Mar-14  A  15 2014.167   14   12 
#4 Apr-14  A  18 2014.250   15   14 
#5 May-14  A  10 2014.333   18   15 
#6 Jun-14  A  12 2014.417   10   18 
#7 Jul-14  A  13 2014.500   12   10 
#8 Aug-14  A  14 2014.583   13   12 
#9 Jan-14  B  32 2014.000   NA   NA 
#10 Feb-14  B  14 2014.083   32   NA 
#11 Mar-14  B  15 2014.167   14   32 
#12 Apr-14  B  18 2014.250   15   14 
#13 May-14  B  20 2014.333   18   15 
#14 Jun-14  B  12 2014.417   20   18 
#15 Jul-14  B  13 2014.500   12   20 
#16 Aug-14  B  14 2014.583   13   12 

Mit data.table

library(data.table) 

setDT(df)[, lag1.Value1:= shift(Value1), ID][, lag2_Value1 := shift(lag1.Value1), ID] 
+0

Ihre beiden Antworten mit den angegebenen Beispieldaten arbeiten hier eingestellt. Aber nur data.table Lösung funktioniert mit meinem tatsächlichen Datensatz. – sriya

0

Mit data.table, können wir dies in einem einzigen Schritt als shift ta zu tun kes eine Folge von ‚n‘

library(data.table) 
setDT(df)[, paste0("lag", 1:2, "_Value1") := shift(Value1, 1:2), by = ID] 
df 
#  Time ID Value1 Time1 lag1_Value1 lag2_Value1 
# 1: Jan-14 A  12 2014.000   NA   NA 
# 2: Feb-14 A  14 2014.083   12   NA 
# 3: Mar-14 A  15 2014.167   14   12 
# 4: Apr-14 A  18 2014.250   15   14 
# 5: May-14 A  10 2014.333   18   15 
# 6: Jun-14 A  12 2014.417   10   18 
# 7: Jul-14 A  13 2014.500   12   10 
# 8: Aug-14 A  14 2014.583   13   12 
# 9: Jan-14 B  32 2014.000   NA   NA 
#10: Feb-14 B  14 2014.083   32   NA 
#11: Mar-14 B  15 2014.167   14   32 
#12: Apr-14 B  18 2014.250   15   14 
#13: May-14 B  20 2014.333   18   15 
#14: Jun-14 B  12 2014.417   20   18 
#15: Jul-14 B  13 2014.500   12   20 
#16: Aug-14 B  14 2014.583   13   12 
+0

Die Datentabellenstruktur führt jedoch dazu, dass diese Antworten nicht für die Konvertierung von Daten in PLM verwendet werden können. Er gibt folgende Fehlermeldung.Error in '[.data.table' (x, i, was = TRUE): Wenn i eine data.table (oder ein Zeichenvektor) ist, muss x eingegeben werden (dh sortiert und markiert) so sortiert), so dass data.table weiß, mit welchen Spalten es sich verbinden soll und wie x aussortiert werden soll. Zuerst setkey (x, ...) aufrufen, siehe? Setkey. – sriya

+0

@sriya Es ist einfacher, zu data.frame zu wechseln. Sie können 'setDF (df)' verwenden, nachdem wir die neuen Spalten erhalten haben. Ich nehme an, dass data.frame gut für Ihre plm funktioniert. – akrun

+1

Danke, es funktioniert. – sriya