我几周前使用库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))