分组和标准。开发中的R

时间:2013-11-13 18:50:48

标签: r

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

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

我有兴趣在过去四年中获得std.dev的销售额。如果没有四年的数据,如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的数据。

2 个答案:

答案 0 :(得分:2)

您可以使用包动物园中的rollapply

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

[edit]我用你的数据框按年份排序。如果您按原始顺序使用它,则可能需要使用align =“left”

答案 1 :(得分: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)});