Data.table внешнее соединение по группам
Я пытаюсь использовать 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 для каждой группы фонда-holdid и использовать ее, но мои данные составляют > 20 миллионов строк, и я пытаюсь написать более эффективное решение. Спасибо за помощь.
EDIT Чтобы уточнить немного больше, я хочу сделать что-то похожее на то, что можно сделать с разделом Oracle SQL внешними объединениями, как показано здесь http://st-curriculum.oracle.com/obe/db/10g/r2/prod/bidw/outerjoin/outerjoin_otn.htm
EDIT-2 В описании я использовал много терминов временных рядов. Чтобы быть более конкретным, для каждой пары, удерживающей фонд, я хочу иметь наблюдение за каждым годом в allqtrs. Таким образом, в этом случае, поскольку есть 3 фонда с 3, 2 и 1 холдингами соответственно, в выводе должно быть (2 + 2 + 1) * 4 общих строчки, так как для каждого фонда есть 4 возможных квартала. Другим важным моментом является то, что холдинги очень разнообразны. Что-то вроде expand.grid(уникальный (фонд), уникальный (холдинг), уникальный (allqtrs)) приведет к слишком большому количеству строк, поскольку каждый фонд будет иметь только небольшое подмножество возможных холдингов.
Ответы
Ответ 1
Всегда полезно публиковать ответ, который вы ожидаете, чтобы избежать какой-либо двусмысленности/недопонимания. Это то, что вы ищете?
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