首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R逐群推进最后观察n次

R逐群推进最后观察n次
EN

Stack Overflow用户
提问于 2018-01-22 23:44:05
回答 1查看 261关注 0票数 0

这个快把我逼疯了。我有一个很大的data.table和每月的股票数据。每年六月,我根据一个会计变量将每只股票分配给10个投资组合中的一个。我想把指定的投资组合变量转入下一个11个月,直到明年6月每只股票被分配到一个新的投资组合1到10。na.locf基本上就是我要找的东西,但我遇到了两个问题:

  1. 有些股票在下一年缺乏足够的会计数据,因此不应该在那一年分配给投资组合(即投资组合变量应该保持NA)。但当然,na.locf一直在继续推进投资组合的数字,直到有了新的投资组合。
  2. 一些股票可能在3个月后被退市,因此他们没有另外11个月的数据。

这就是为什么我寻找一个代码,将最后的观察结果(最大值为11次)传递到明年6月(当有一个新的投资组合数时)。

这是na.locf解决方案,现在有两个问题(PERMNO是股票标识符):

代码语言:javascript
复制
COMPUSTAT_CRSP_IBES1[,
                     Portfolio_Monthly := na.locf(Portfolio_Monthly, 
                                                  na.rm = FALSE),
                     by = PERMNO]

我试过使用rep,但这根本行不通:

代码语言:javascript
复制
COMPUSTAT_CRSP_IBES1[,
                     Portfolio_Monthly := if_else(!is.na(Portfolio_Monthly), 
                                                  rep(Portfolio_Monthly, 11), 
                                                  NA), 
                     by = PERMNO]

谢谢你的暗示!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-23 07:37:16

您可以创建和/或使用您的财政年度(6月-5月)作为by解决方案中的组na.locf标准之一。

代码语言:javascript
复制
#show data before calculations
data.frame(dat)

#demo FY calculation
dat[, FY := year(MONTH) + as.numeric(month(MONTH) >= 6)]

#actual code
dat[, Portfolio_Monthly := zoo::na.locf(Portfolio_Monthly, na.rm=FALSE),
    by=list(PERMNO, year(MONTH) + as.numeric(month(MONTH) >= 6))]

#show results
data.frame(dat)

样本数据:

代码语言:javascript
复制
library(data.table)
set.seed(0L)
dat <- data.table(PERMNO=rep(LETTERS[1:12], each=20), 
    MONTH=rep(seq(as.Date("2000-01-01"), by="1 month", length.out=20), 12),
    Portfolio_Monthly=NA_real_)
for (i in sample(1:dat[,.N], 5)) {
    set(dat, i, 3L, rnorm(1))   
}
setorder(dat, PERMNO, MONTH)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48392015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档