大きなデータセットをクリーニングしようとしています。私は日付順に価格の行列を持っています。最初の行には最新の日付、列には異なる在庫があります。特定の株式の価格が不足している場合、またはその日のNAがない場合は、前日の価格を使用します。最終日の価格がNAならば、私はそれを残す。この単純なループをRでより効率的にするには?
まず、行列全体をループし、各(i、j)ペアに対してIF文を使用します。これは非常に遅かったです。次のアプローチは、価格行列bについては次のようになります。インデックス化を使用してNAであるインデックスを検索し、これらのみを処理します。
for(j in 1:ncol(b))
{
Index<-which(is.na(b[,j]) | b[,j]==0)
if(length(Index)==0)
{print("0 Missings")
Index<-c(1)#to ensure its not empty}
for(k in length(Index):1)#backwards to fill from the bottom
{
i=Index[k]
#If the oldest date is missing, then set it to N/A so that N/A is passed forward as opposed to 0.
if(i==nrow(b) & (b[[i,j]]==0 | is.na(b[[i,j]])))
{
b[[i,j]]<-'#N/A'
}
else(b[[i,j]]==0 | is.na(b[[i,j]]))
{
b[[i,j]] <- b[[i+1,j]]#Take the price from the date before
}
}
}
これは少し高速ですが、それほど多くはありません。それでも400x6000のマトリックスでは1時間以上かかる。
b[[Index,j]]<-b[[Index+1,j]]
は、しかし、私はRが順次更新された値を使用するとは思わない。私は私のような何かをした、完全にベクトル化アプローチ、を期待していました。これによって、新しい値が使用されるように、底から漸進的に更新されることはありません。これは、2つのNAエントリを連続して持つ場合に重要です。上記のベクトル化されたアプローチは1つしか満たさないからです。しかし、ある種の効率的な順次ベクトル化されたコードは、最初のものを更新し、これを使って2番目のものを更新します。何か案は?あなたの努力
"最後に観測を繰り越し"操作を実行したかったようです。これはパッケージzooの 'na.locf'関数で実装されています。 (もちろん、欠損値は実際には「NA」でエンコードされていますが、テキストではありません。データのインポート中にこの点を注意してください。) – Roland
使用する言語を決めてから、もう一方を削除してください質問タグ。 – Roland
私は現時点でRに入っていますが、私はパッケージ(ブラックボックス)とは対照的にベクトル化されたアプローチを望んでいたので、どちらの言語でもアプローチは非常に似ていると思いました – MathsQuant525