我有一个名为 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))});