使用'data.table':error避免'foreach';组合:=在j中与by的组合尚未实现”;

使用'data.table':error避免'foreach';组合:=在j中与by的组合尚未实现”;,r,foreach,data.table,R,Foreach,Data.table,几周前,我使用库foreach创建了一个函数。此函数用于在我的数据集中查找公司上个月的市值。由于此数据集非常大,我试图仅使用data.table重写此函数(完全删除foreach),但到目前为止我没有成功 以下是我拥有的:my data.table对象(除其他列外)包含一列,其中包含一个整数,用于指定当前月份(TM)、公司编号(PERMNO)、该月末的市值(MKTCAP)以及一列上个月的整数(PM)。以下是1962年的表格摘要: > summary(results62) TM

几周前,我使用库
foreach
创建了一个函数。此函数用于在我的数据集中查找公司上个月的市值。由于此数据集非常大,我试图仅使用
data.table
重写此函数(完全删除
foreach
),但到目前为止我没有成功

以下是我拥有的:my data.table对象(除其他列外)包含一列,其中包含一个整数,用于指定当前月份(TM)、公司编号(PERMNO)、该月末的市值(MKTCAP)以及一列上个月的整数(PM)。以下是1962年的表格摘要:

> summary(results62)
       TM             PERMNO          MKTCAP                PM        
 Min.   :196201   Min.   :10006   Min.   :      41   Min.   :196112  
 1st Qu.:196205   1st Qu.:18382   1st Qu.:   11462   1st Qu.:196204  
 Median :196208   Median :24328   Median :   37367   Median :196207  
 Mean   :196207   Mean   :24349   Mean   :  215224   Mean   :196201  
 3rd Qu.:196210   3rd Qu.:29866   3rd Qu.:  132181   3rd Qu.:196209  
 Max.   :196212   Max.   :86239   Max.   :31349066   Max.   :196211  
                                                     NA's   :25     
(例如,这里196201表示1962年1月)

为了开始,我创建了一个新对象,其中包含公司PERMNO=10006的数据

> data1006 <- results62[PERMNO == 10006,]
> data10006
          TM PERMNO    MKTCAP     PM
 [1,] 196201  10006 104171.00 196112
 [2,] 196202  10006 104527.75 196201
 [3,] 196203  10006  97036.00 196202
 [4,] 196204  10006 102565.62 196203
 [5,] 196205  10006  85263.25 196204
 [6,] 196206  10006  84193.00 196205
 [7,] 196207  10006  98077.50 196206
 [8,] 196208  10006  97532.62 196207
 [9,] 196209  10006  92265.50 196208
[10,] 196210  10006  98804.00 196209
[11,] 196211  10006 105887.38 196210
[12,] 196212  10006 112062.62 196211
包括我使用的每个观察的上个月市值

> data1006[,LAGMKTCAP := data1006$MKTCAP[match(data1006$PM,data1006$TM)]]
          TM PERMNO    MKTCAP      PM LAGMKTCAP
 [1,] 196201  10006 104171.00  196112        NA
 [2,] 196202  10006 104527.75  196201 104171.00
 [3,] 196203  10006  97036.00  196202 104527.75
 [4,] 196204  10006 102565.62  196203  97036.00
 [5,] 196205  10006  85263.25  196204 102565.62 
 [6,] 196206  10006  84193.00  196205  85263.25 
 [7,] 196207  10006  98077.50  196206  84193.00
 [8,] 196208  10006  97532.62  196207  98077.50
 [9,] 196209  10006  92265.50  196208  97532.62
[10,] 196210  10006  98804.00  196209  92265.50
[11,] 196211  10006 105887.38  196210  98804.00
[12,] 196212  10006 112062.62  196211 105887.38
这是完美的。现在,我需要使用包含数千家公司的整个数据集为每个公司执行此操作。我最好的尝试是

> results62[,LAGMKTCAP := results62$MKTCAP[match(results62$PM,results62$TM)],by=PERMNO]
但是我得到了错误

[.data.table
中出错(结果62,
:=
(LAGMKTCAP, results62$MKTCAP[match(results62$PM,:combing:=in j with by 尚未实现。请让维护人员('data.table')知道 你对此很感兴趣

除了使用
foreach
,我不知道如何做到这一点:我可以用唯一的公司数创建一个向量,并按如下方式进行迭代:

conumb <- unique(results62$PERMNO)

lag.mkt.cap <- function(results62){
results62$MKTCAP[match(results62$PM,results62$TM)]
}

lagmktcap <- foreach(i=1:length(conumb),.combine=c) %do% lag.mkt.cap(results62[PERMNO == conumb[i],])

我想我应该说,缺少了一些观察结果,我无法简单地获得前一行的市值。仅供参考
:=
是在r-forge上托管的1.81版中实现的。@matthew dowle概述了#*@$#!它工作了,它工作了!!!我想跳起来,尖叫着亲吻matthew!@Chase,你说什么?以答案?我的问题已经解决了……哈!太棒了。我相信马特会感激互联网带来的好业力。请随意回答你自己的问题,我所做的只是为你指出了正确的方向:):-)Vivi,你可能刚刚超越了@DavyKavanagh的评论,我曾在最近的一期节目中发表过这一评论!是的,s.O.鼓励回答你自己的问题。如果你能点击Crantastic上的“我使用它!”按钮,这将真正有助于鼓励我们(以及你使用的其他软件包)。
conumb <- unique(results62$PERMNO)

lag.mkt.cap <- function(results62){
results62$MKTCAP[match(results62$PM,results62$TM)]
}

lagmktcap <- foreach(i=1:length(conumb),.combine=c) %do% lag.mkt.cap(results62[PERMNO == conumb[i],])
dataexample <- data.table(TM = c(196201L, 196202L, 196203L, 196204L, 196201L, 196202L, 196203L, 196204L, 196201L, 196202L, 196203L, 196204L), 
PERMNO = c(10006L, 10006L, 10006L, 10006L, 10014L, 10014L, 10014L, 10014L, 10030L, 10030L, 10030L, 10030L), 
MKTCAP = c(104171, 104527.75, 97036, 102565.625, 13290.75, 14499, 13693.5, 12485.25, 81600, 83232, 81600, 82416), 
PM = c(196112L, 196201L, 196202L, 196203L, 196112L, 196201L, 196202L, 196203L, 196112L, 196201L, 196202L, 196203L))