NAとゼロの値を再帰的に置き換えようとしています。NAまたはゼロを前の週の値に置き換えるのが最適な時系列データに取り組んでいます(15分ごとの測定なので672ステップ戻ります)。私のデータには、15 分の値の約 2 年間のデータが含まれているため、これは大きなセットです。多くの NA またはゼロは予想されず、隣接する一連のゼロまたは NA >672 も予想されません。
再帰的な方法が示されているこのスレッド(Rの再帰的置換)を見つけ、それを私の問題に適応させました。
load[is.na(load)] <- 0
o <- rle(load)
o$values[o$values == 0] <- o$values[which(o$values == 0) - 672]
newload<-inverse.rle(o)
これは「最善」の方法ですか、それともエレガントな方法ですか? また、最初の 672 個の値の中でゼロ値が発生した場合、コードをエラーから保護するにはどうすればよいでしょうか?
私は次のようなことをするmatlabに慣れていました:
% Replace NaN with 0
Load(isnan(Load))=0;
% Find zero values
Ind=find(Load==0);
for f=Ind
if f>672
fprintf('Replacing index %d with the load 1 day ago\n', Ind)
% Replace zero with previous week value
Load(f)=Load(f-672);
end
end
Rに慣れていないので、if elseループをどのように設定しますか?
再現可能な例(他のスレッドから使用された例は隣接するゼロに対処しなかったため、コードを変更してください):
day<-1:24
load<-rep(day, times=10)
load[50:54]<-0
load[112:115]<-NA
load[is.na(load)] <- 0
load[load==0]<-load[which(load == 0) - 24]
これにより、ゼロとNAのない元のロードデータフレームが得られます。最初の 24 個の値にゼロが存在する場合、置き換える値がないため、これは正しくありません。
loadtest[c(10,50:54)]<-0 # instead of load[50:54]<-0 gives:
Error in loadtest[which(loadtest == 0) - 24] :
only 0's may be mixed with negative subscripts
これを回避するには、if else ステートメントを使用できますが、適用方法がわかりません。何かのようなもの:
day<-1:24
loadtest<-rep(day, times=10)
loadtest[c(10,50:54)]<-0
loadtest[112:115]<-NA
loadtest[is.na(loadtest)] <- 0
if(INDEX(loadtest[loadtest==0])<24) {
# nothing / mean / standard value
} else {
loadtest[loadtest==0]<-loadtest[which(loadtest == 0) - 24]
}
もちろんINDEXは有効なコードではありません..