R 将最后一次观察按组进行 n 次
R carry forward last observation n times by group
这个让我抓狂。我有一个很大的 data.table 每月库存数据。每年六月,我都会根据会计变量将每只股票分配给 10 个投资组合之一。我想将指定的投资组合变量结转到下一个 11 个月,直到明年 6 月每只股票都被分配到新的投资组合 1 到 10。 na.locf
基本上是我要找的东西,但我 运行 遇到了 2 个问题:
- 有些股票明年缺乏足够的会计数据,因此不应将它们分配到当年的投资组合(即投资组合变量应保持 NA)。但是当然
na.locf
会继续推进投资组合编号,直到有新的为止。
- 一些股票可能会在例如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]
感谢任何提示!
您可以创建and/or使用您的财政年度(6 月 - 5 月)作为您的na.locf
解决方案
中的组by
标准之一
#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)
这个让我抓狂。我有一个很大的 data.table 每月库存数据。每年六月,我都会根据会计变量将每只股票分配给 10 个投资组合之一。我想将指定的投资组合变量结转到下一个 11 个月,直到明年 6 月每只股票都被分配到新的投资组合 1 到 10。 na.locf
基本上是我要找的东西,但我 运行 遇到了 2 个问题:
- 有些股票明年缺乏足够的会计数据,因此不应将它们分配到当年的投资组合(即投资组合变量应保持 NA)。但是当然
na.locf
会继续推进投资组合编号,直到有新的为止。 - 一些股票可能会在例如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]
感谢任何提示!
您可以创建and/or使用您的财政年度(6 月 - 5 月)作为您的na.locf
解决方案
by
标准之一
#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)