ライブラリを使用して数週間前に関数を作成しました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
次に、NAをプレースホルダーとしてLAGMKTCAPという列を作成しました
> 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]
しかし、私はエラーが発生します
Error in
[.data.table
(results62, ,:=
(LAGMKTCAP, results62$MKTCAP[match(results62$PM, : j の := と by の結合はまだ実装されていません。これに興味がある場合は、maintainer('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))