1

几周前我使用库创建了一个函数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]

但我得到了错误

( results62 , [.data.table, :=(LAGMKTCAP, results62$MKTCAP[match(results62$PM, : Combining := 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:使用这个包含 3 家公司跨越 4 个月的数据的示例数据集可能会有所帮助:

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

0 回答 0