我有一个名为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的数据。
答案 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)});