我正在尝试使用data.table来填充我所拥有的大型不平衡多维面板中的缺失观察结果。下面是一个数据示例,其中包含一些关于我想要的评论:
mydat <- structure(list(fund = c(1, 1, 1, 1, 2, 2, 2, 3, 3), holdingid = c(10,
10, 11, 11, 15, 15, 14, 20, 20), yearqtr = structure(c(2000,
2000.5, 2000, 2000.25, 2000, 2000.75, 2000.25, 2000.25, 2000.5
), class = "yearqtr"), shares = c(20, 25, 30, 30, 34, 34, 4,
8, 10)), .Names = c("fund", "holdingid", "yearqtr", "shares"), row.names = c(NA,
-9L), class = "data.frame")
allqtrs <- structure(c(2000, 2000.25, 2000.5, 2000.75), class = "yearqtr")
#note that there are missing yearqtrs for some fund-holding series
#if a fund-holding series is missing an observation I want to create
#that fund-holding-quarter and fill it with NA
我正在努力平衡小组与最终落后(或差异)每个基金持有系列的目标(在数据的不规则性得到照顾的意义上)。显然,我可以使用zooreg为每个基金持有组并使用此滞后,但我的数据是> 2000万行,我正在尝试编写更有效的解决方案。谢谢你的帮助。
编辑为了澄清一点,我希望做一些类似于外部联接的Oracle SQL分区可以做的事情,如此处所示http://st-curriculum.oracle.com/obe/db/10g/r2/prod/bidw/outerjoin/outerjoin_otn.htm
EDIT-2 我在说明中使用了很多时间序列术语。更具体地说,对于每个资金持有对,我希望对allqtrs中的每个年份进行观察。因此,在这种情况下,由于有3个基金分别拥有3个,2个和1个持股,因此每个基金持有有4个可能的季度,因此输出中应该有(2 + 2 + 1)* 4个总行。另一个重要的一点是,持有人非常多样化。像expand.grid(unique(fund),unique(holdingid),unique(allqtrs))这样的东西会导致行太多,因为每个基金只会有一小部分可能的持股。
答案 0 :(得分:7)
发布您期望的答案总是好的,以避免任何歧义/错误传达。这是你在找什么?
require(data.table)
dt <- as.data.table(mydat)
setkey(dt, "yearqtr")
dt[, .SD[J(allqtrs)], by = list(fund, holdingid)]
# fund holdingid yearqtr shares
# 1: 1 10 2000.00 20
# 2: 1 10 2000.25 NA
# 3: 1 10 2000.50 25
# 4: 1 10 2000.75 NA
# 5: 1 11 2000.00 30
# 6: 1 11 2000.25 30
# 7: 1 11 2000.50 NA
# 8: 1 11 2000.75 NA
# 9: 2 15 2000.00 34
# 10: 2 15 2000.25 NA
# 11: 2 15 2000.50 NA
# 12: 2 15 2000.75 34
# 13: 2 14 2000.00 NA
# 14: 2 14 2000.25 4
# 15: 2 14 2000.50 NA
# 16: 2 14 2000.75 NA
# 17: 3 20 2000.00 NA
# 18: 3 20 2000.25 8
# 19: 3 20 2000.50 10
# 20: 3 20 2000.75 NA