1. ホーム
  2. r

[解決済み] Rでのインデックスマッチ

2022-02-07 22:58:55

質問内容

Rでインデックスマッチを再現する方法を検索したところ、小さいデータセットには有効なソリューションが見つかりましたが、(a)5年間の複数のスワップ金利の日次履歴と(b)20万以上のレコードを持つ個々のローンの詳細の2つのデータフレームではうまくいきませんでした。 私はExcelでindex(match)を使って結果を操作しましたが、Rでそれを行う効率的な方法を学びたかったのです。

簡単に言うと、こんな感じです。

RateData <- data.frame(Date = c("2018-01-01","2018-01-05","2018-01-08","2018-01-17"), 
               Threeyr = c(1.25,1.27,1.29, 1.30), 
               Fiveyr = c(2.3,2.31,2.34, 2.4),
               Tenyr = c(2.8,2.89,2.75, 2.6),
               PRIME = c(4.0,4,4, 4.25))

LoanData <- data.frame(OriginationDate = c("2018-01-01","2018-01-01","2018-01-01","2018-01-05",
                                       "2018-01-08","2018-01-08","2018-01-17"),
                   LNTYPE = c(83,101,115,83,83,105,115),
                   PriceIndex = c('Threeyr','Fiveyr','PRIME','Threeyr','Threeyr','Fiveyr','PRIME'))

データをマッチング/ジョインして、適切なインデックスから特定のオリジネーション日のレートだけをLoanDataの新しいカラムに入力したいのです。 他の投稿にあった spread() / gather() を使った提案を再度試してみましたが、この小さな例ではうまくいきましたが、私のデータセット全体ではメモリを使いすぎました。

下記を試してみましたが、行列のような結果になってしまいました。

LoanData$Rate <- RateData[match(LoanData$OriginationDate,RateData$Date),
                      match(LoanData$PriceIndex,colnames(RateData))]

どうすれば、期待通りの結果が得られるのでしょうか?

LoanData1 <- data.frame(OriginationDate = c("2018-01-01","2018-01-01","2018-01-01","2018-01-05",
                                       "2018-01-08","2018-01-08","2018-01-17"),
                   LNTYPE = c(83,101,115,83,83,105,115),
                   PriceIndex = c('Threeyr','Fiveyr','PRIME','Threeyr','Threeyr','Fiveyr','PRIME'),
                   Rate = c(1.25,2.30,4,1.27,1.29,2.34,4.25))

どんなことでもご相談ください。

解決方法は?

ただ、行列を使って多次元で添え字をつけないと、組み合わせの積になってしまうんだ。正しいのは

LoanData$Rate <- RateData[cbind(
  match(LoanData$OriginationDate, RateData$Date),
  match(LoanData$PriceIndex, colnames(RateData))
)]