5

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

私は、各ファンド保有 ID シリーズを適切に遅らせる (または差異化する) という最終目標とパネルのバランスをとろうとしています (データの不規則性が処理されるという意味で)。明らかに、ファンド保有 ID グループごとにzooreg を使用し、これを使用して遅れることができますが、私のデータは 2,000 万行を超えており、より効率的なソリューションを作成しようとしています。助けてくれてありがとう。

編集もう少し明確にするために、ここで示されているように、外部結合によってOracle SQLのパーティションでできることと同様のことをしようとしていますhttp://st-curriculum.oracle.com/obe/db/10g/r2/prod/入札/outerjoin/outerjoin_otn.htm

EDIT-2説明の中で多くの時系列用語を使用しました。より具体的に言うと、ファンド保有ペアごとに、allqtrs のすべての yearqtr について観察したいと考えています。したがって、この場合、それぞれ 3、2、および 1 の保有を持つ 3 つのファンドがあるため、出力には合計 (2+2+1)*4 行があるはずです。これは、ファンド保有ごとに 4 つの可能な四半期があるためです。もう 1 つの重要な点は、holdingid が非常に多様であることです。expand.grid(unique(fund),unique(holdingid),unique(allqtrs)) のようなものは、各ファンドが可能な保有の小さなサブセットしか持たないため、非常に多くの行につながります。

4

1 に答える 1

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
于 2013-06-02T08:13:05.897 に答える