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