0

这个让我发疯。我有一个包含每月库存数据的大型数据表。每年六月,我都会根据一个会计变量将每只股票分配给 10 个投资组合中的一个。我想将分配的投资组合变量结转到下一个 11 个月,直到明年 6 月每只股票都被分配到新的投资组合 1 到 10。na.locf基本上是我正在寻找的,但我遇到了两个问题:

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

这就是为什么我要寻找一种代码,该代码最多可将最后一次观察结果进行最多 11 次,直到明年 6 月(当有新的投资组合编号时)。

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

COMPUSTAT_CRSP_IBES1[,
                     Portfolio_Monthly := na.locf(Portfolio_Monthly, 
                                                  na.rm = FALSE),
                     by = PERMNO]

我尝试使用rep,但根本没有用:

COMPUSTAT_CRSP_IBES1[,
                     Portfolio_Monthly := if_else(!is.na(Portfolio_Monthly), 
                                                  rep(Portfolio_Monthly, 11), 
                                                  NA), 
                     by = PERMNO]

感谢您的任何提示!

4

1 回答 1

1

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

#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)

样本数据:

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)
于 2018-01-23T07:37:16.773 回答