我有一个名为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});
但这是一个很慢的。任何替代和有效的方法来做这个?
编辑: 刚刚意识到第一个代码中有一个拼写错误:数据而不是dt在一个地方。仍然不会删除这篇文章,万一,可能会帮助某人。而且,人们可以帮助我回答,是否有更有效的方法来完成任务
dt$ROAL <- ave(dt$ROANew, data$GVKEY, FUN = function(x) {c(NA, head(x,-1))});
答案 0 :(得分:0)
ave
是去这里的方式。如果你有一个大的数据集,你可以移动到data.table
也是更多的语法糖:
library(data.table)
DT <- as.data.table(dt)
DT[, ROAL :=c(NA,head(ROANew,-1)),by='GVKEY']