使用'data.table':error避免'foreach';组合:=在j中与by的组合尚未实现”;
几周前,我使用库使用'data.table':error避免'foreach';组合:=在j中与by的组合尚未实现”;,r,foreach,data.table,R,Foreach,Data.table,几周前,我使用库foreach创建了一个函数。此函数用于在我的数据集中查找公司上个月的市值。由于此数据集非常大,我试图仅使用data.table重写此函数(完全删除foreach),但到目前为止我没有成功 以下是我拥有的:my data.table对象(除其他列外)包含一列,其中包含一个整数,用于指定当前月份(TM)、公司编号(PERMNO)、该月末的市值(MKTCAP)以及一列上个月的整数(PM)。以下是1962年的表格摘要: > summary(results62) TM
foreach
创建了一个函数。此函数用于在我的数据集中查找公司上个月的市值。由于此数据集非常大,我试图仅使用data.table
重写此函数(完全删除foreach
),但到目前为止我没有成功
以下是我拥有的:my 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年1月)
为了开始,我创建了一个新对象,其中包含公司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
包括我使用的每个观察的上个月市值
> 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,:combing:=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],])
我想我应该说,缺少了一些观察结果,我无法简单地获得前一行的市值。仅供参考
:=
是在r-forge上托管的1.81版中实现的。@matthew dowle概述了#*@$#!它工作了,它工作了!!!我想跳起来,尖叫着亲吻matthew!@Chase,你说什么?以答案?我的问题已经解决了……哈!太棒了。我相信马特会感激互联网带来的好业力。请随意回答你自己的问题,我所做的只是为你指出了正确的方向:):-)Vivi,你可能刚刚超越了@DavyKavanagh的评论,我曾在最近的一期节目中发表过这一评论!是的,s.O.鼓励回答你自己的问题。如果你能点击Crantastic上的“我使用它!”按钮,这将真正有助于鼓励我们(以及你使用的其他软件包)。
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],])
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))