1

我有一个名为 dt 的数据集。它的快照如下:

   GVKEY FYEAR      ROANew
1   1004  2003  0.00502037
2   1004  2004  0.02143984
3   1004  2005  0.04110110
4   1004  2006  0.05732849
5   1004  2007  0.06185600
6   1004  2008  0.05741953
7   1004  2009  0.03100725
8   1004  2010  0.04357631
9   1004  2011  0.03473527
10  1004  2012  0.02538919
11  1013  2003 -0.06284052
12  1013  2004  0.01203670
13  1013  2005  0.07471904
14  1013  2006  0.04176201
15  1013  2007  0.06297020...

我想创建一个新列 ROAL,其中对于每个 GVKEY,ROAL(t) = ROANew (t-1)。因此,新数据将如下所示:

   GVKEY FYEAR      ROANew        ROAL
1   1004  2003  0.00502037          NA
2   1004  2004  0.02143984  0.00502037
3   1004  2005  0.04110110  0.02143984
4   1004  2006  0.05732849  0.04110110
5   1004  2007  0.06185600  0.05732849
6   1004  2008  0.05741953  0.06185600
7   1004  2009  0.03100725  0.05741953
8   1004  2010  0.04357631  0.03100725
9   1004  2011  0.03473527  0.04357631
10  1004  2012  0.02538919  0.03473527
11  1013  2003 -0.06284052          NA
12  1013  2004  0.01203670 -0.06284052
13  1013  2005  0.07471904  0.01203670
14  1013  2006  0.04176201  0.07471904
15  1013  2007  0.06297020  0.04176201...

我通过两种方式做到了:

dt$ROAL <- ave(dt$ROANew, data$GVKEY, FUN = function(x) {c(NA, head(x,-1))}); 

但是,我收到一条警告消息

 Warning messages:
1: In split.default(x, g) :
  data length is not a multiple of split variable
2: In split.default(seq_along(x), f, drop = drop, ...) :
  data length is not a multiple of split variable

第二个代码是,

dt <- ddply(dt,.(GVKEY),function(x) {x$ROAL <- c(NA, head(x$ROANew, -1));x});

但这是一个非常缓慢的。任何替代和有效的方法来做到这一点?

编辑:刚刚意识到第一个代码中有一个错字: data 而不是 dt 在一个地方。仍然不会删除此帖子,以防万一,可能对某人有所帮助。而且,仍然可以帮助我回答,是否有更有效的方法来完成任务

dt$ROAL <- ave(dt$ROANew, data$GVKEY, FUN = function(x) {c(NA, head(x,-1))}); 
4

1 回答 1

0

ave是去这里的路。如果你有一个大数据集,你可以移动到data.table更多的语法糖:

library(data.table)
DT <- as.data.table(dt)
DT[, ROAL :=c(NA,head(ROANew,-1)),by='GVKEY']
于 2013-11-10T22:04:36.457 回答