-2

我有一个名为 dt 的数据框。dt 看起来像这样。

Year Sale
2009  6
2008  3
2007  4
2006  5
2005  12
2004  3

我有兴趣在过去四年中获得 std.dev 的销售额。如果没有 4 年的数据,比如 2006、2005 和 2004,我想得到 NA。如何使用与每年对应的值创建一个新列。新数据看起来像。

 Year Sale  std.
2009  6     std(05,06,07,08)
2008  3     std(07,06,05,04)
2007  4     NA
2006  5     NA
2005  12    NA
2004  3     NA

我尝试了很多,但是因为我是 R 的新手,所以我做不到。有人请帮忙。谢谢。

编辑:这是 GVKEY 的数据。

    GVKEY FYEAR    IBC
 1  1004  2003  3.504
 2  1004  2004 18.572
 3  1004  2005 35.163
 4  1004  2006 59.447
 5  1004  2007 75.745

问候

编辑:

我以这种方式使用提到的函数 rollapply 函数:

dt <- ddply(dt, .(GVKEY), function(x){x$ww <- rollapply(x$Sale,4,sd, fill =NA, align="right"); x}); 

但我收到以下错误。 Error in seq.default(start.at, NROW(data), by = by) : wrong sign in 'by' argument

不知道我做错了什么。顶部提到了带有 GVKEY 的数据。

4

2 回答 2

2

您可以rollapply从包 zoo 中使用:

require(zoo)
rollapply(df$Sale, 4, sd, fill=NA, align="right")

[编辑] 我使用了按年份排序的数据框。如果您按原始顺序使用它,您可能需要使用 align="left"

于 2013-11-13T19:09:07.933 回答
0

这就是我解决问题的方法:

dt <- dt[order(dt$GVKEY,dt$FYEAR),]; 
  dt <- sqldf("select GVKEY, FYEAR, IBC from dt");
  dt$STDEARN <- ave(dt$IBC, dt$GVKEY,FUN = function(x) {if(length(x)>3) c(NA,head(runSD(x,4),-1)) else sample(NA,length(x),TRUE)});
于 2013-11-14T13:52:00.530 回答