Dan*_*gan 11 r time-series lag
我有一个类似于此的数据集
User Date Value
A 2012-01-01 4
A 2012-01-02 5
A 2012-01-03 6
A 2012-01-04 7
B 2012-01-01 2
B 2012-01-02 3
B 2012-01-03 4
B 2012-01-04 5
Run Code Online (Sandbox Code Playgroud)
我想创造一个Value尊重的滞后User.
User Date Value Value.lag
A 2012-01-01 4 NA
A 2012-01-02 5 4
A 2012-01-03 6 5
A 2012-01-04 7 6
B 2012-01-01 2 NA
B 2012-01-02 3 2
B 2012-01-03 4 3
B 2012-01-04 5 4
Run Code Online (Sandbox Code Playgroud)
我在循环中做得非常低效
df$value.lag1<-NA
levs<-levels(as.factor(df$User))
levs
for (i in 1:length(levs)) {
temper<- subset(df,User==as.numeric(levs[i]))
temper<- rbind(NA,temper[-nrow(temper),])
df$value.lag1[df$User==as.numeric(as.character(levs[i]))]<- temper
}
Run Code Online (Sandbox Code Playgroud)
但这很慢.我看使用by和tapply,但没有想出如何使他们的工作.
我认为XTS或TS不会因为User元素而起作用.
有什么建议?
您可以使用ddply:它将data.frame切割成碎片并转换每个碎片.
d <- data.frame(
User = rep( LETTERS[1:3], each=10 ),
Date = seq.Date( Sys.Date(), length=30, by="day" ),
Value = rep(1:10, 3)
)
library(plyr)
d <- ddply(
d, .(User), transform,
# This assumes that the data is sorted
Value = c( NA, Value[-length(Value)] )
)
Run Code Online (Sandbox Code Playgroud)
小智 6
我认为最简单的方法,尤其是考虑进行进一步分析时,是将数据框pdata.frame从plm包转换为类。
转换后 fromdiff()和lag()运算符可用于创建面板差异和滞后。
df<-pdata.frame(df,index=c("id","date"))
df<-transform(df, l_value=lag(value,1))
Run Code Online (Sandbox Code Playgroud)