使用`data.table`避免`foreach`:错误“组合:=在j中与by尚未实现”

时间:2012-07-02 16:12:00

标签: r foreach data.table

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

这就是我所拥有的:我的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-JAN,例如)

为了让我开始,我创建了一个新对象,其中包含公司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

然后我创建了一个名为LAGMKTCAP的列,其中NAs为占位符

> data1006[,LAGMKTCAP := NA_real_]

要包括我使用的每个观察的上个月市值

> 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,:Combining:= in 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],])

这已经是我之前功能的一大改进(需要1/6的时间),但我真的想避免使用foreach并充分利用data.table。有任何想法吗?

PS:使用此示例数据集可能会有所帮助,该数据集包含跨越4个月的3家公司的数据:

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))

0 个答案:

没有答案