Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将函数应用于R中面板数据中的滚动窗口_R_Time Series_Panel Data_Rollapply - Fatal编程技术网

将函数应用于R中面板数据中的滚动窗口

将函数应用于R中面板数据中的滚动窗口,r,time-series,panel-data,rollapply,R,Time Series,Panel Data,Rollapply,我尝试在滚动窗口中按类别应用一个函数(比如标准偏差): 我有以下数据: cat = c("A", "A", "A", "A", "B", "B", "B", "B") year = c(1990, 1991, 1992, 1993, 1990, 1991, 1992, 1993) value = c(2, 3, 5, 6, 8, 9, 4, 5) df = data.frame(cat, year, value) 我想创建一个新的列(比如sd),用cat估计两年窗口内的标准偏差 以下是我

我尝试在滚动窗口中按类别应用一个函数(比如标准偏差):

我有以下数据:

cat = c("A", "A", "A", "A", "B", "B", "B", "B") 
year = c(1990, 1991, 1992, 1993, 1990, 1991, 1992, 1993) 
value = c(2, 3, 5, 6, 8, 9, 4, 5) 
df = data.frame(cat, year, value)
我想创建一个新的列(比如sd),用cat估计两年窗口内的标准偏差

以下是我想到的结果:


关于如何实现这一点,您有什么建议吗?

可以使用
zoo
软件包中的
rollapply

library(zoo)

cat = c("A", "A", "A", "A", "B", "B", "B", "B") 
year = c(1990, 1991, 1992, 1993, 1990, 1991, 1992, 1993) 
value = c(2, 3, 5, 6, 8, 9, 4, 5) 
df = data.frame(cat, year, value)

df$stdev <- unlist(by(df, df$cat, function(x) {
  c(NA, rollapply(x$value, width=2, sd))
}), use.names=FALSE)

print(df)
##   cat year value     stdev
## 1   A 1990     2        NA
## 2   A 1991     3 0.7071068
## 3   A 1992     5 1.4142136
## 4   A 1993     6 0.7071068
## 5   B 1990     8        NA
## 6   B 1991     9 0.7071068
## 7   B 1992     4 3.5355339
## 8   B 1993     5 0.7071068
作为一个百灵鸟,我对上述两种方法进行了
system.time
(多次)比较,以及在回答下面的评论线程中指出的
ave
方法(从数据帧的“新”副本开始)

ddply
版本采用:

   user  system elapsed 
  0.004   0.000   0.004 

速度并不是一个真正的问题,但看起来
ave
by
版本是最有效的方法。

谢谢,但这并不完全正确-我希望这些标准偏差按“cat”分组。我可以在这里使用ddply或类似的东西吗?不需要
unlist(by(…)
-
ave
可能更合适:
带有(df,ave(value,cat,FUN=function(x)c(NA,rollappy(x,width=2,sd))
Nice。没有想到ave。它有
交互作用(…);split(x,g)通过使用
rollappyr
fill=NA
参数可以稍微简化:
ave(df$value,df$cat,FUN=function(v)rollappyr(v,2,sd,fill=NA))
现在我想返回并将其添加到时间测试中!这是最好的全面解决方案。
df <- data.frame(cat, year, value)
system.time(df$stdev <- with(df, ave(value, cat, FUN=function(x) c(NA, rollapply(x, width=2, sd)))))

df <- data.frame(cat, year, value)
system.time(df$stdev <- unlist(by(df, df$cat, function(x) c(NA, rollapply(x$value, width=2, sd))), use.names=FALSE))

df <- data.frame(cat, year, value)
system.time(df$stdev <- ddply(df, .(cat), summarise, stdev=c(NA, rollapply(value, width=2, sd)))$stdev)
   user  system elapsed 
  0.002   0.000   0.002 
   user  system elapsed 
  0.004   0.000   0.004