在R中转移价值观

时间:2013-11-10 20:00:11

标签: r

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

1 个答案:

答案 0 :(得分:0)

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

library(data.table)
DT <- as.data.table(dt)
DT[, ROAL :=c(NA,head(ROANew,-1)),by='GVKEY']