4

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は有効なコードではありません..

4

2 に答える 2

1

1 つのオプションは、ベクトルを 672 行の行列にラップすることです。

load2 <- matrix(load, nrow=672)

次に、繰り越された最後の観測値 (動物園から、または上記の方法、または ...) を行列の各行に適用します。

load3 <- apply( load2, 1, locf.function )

次に、結果の行列を正しい長さのベクトルに戻します。

load4 <- t(load3)[ seq_along(load) ]
于 2013-09-17T19:01:32.070 に答える
1

次の例を使用できます。

set.seed(42)

x <- sample(c(0,1,2,3,NA), 100, T)

stepback <- 6

x_old <- x
x_new <- x_old

repeat{
    filter <- x_new==0 | is.na(x_new)
    x_new[filter] <- c(rep(NA, stepback), head(x_new, -stepback))[filter]
    if(identical(x_old,x_new)) break
    x_old <- x_new
}

x
x_new

結果:

> x
  [1] NA NA  1 NA  3  2  3  0  3  3  2  3 NA  1  2 NA NA  0  2  2 NA  0 NA NA  0
 [26]  2  1 NA  2 NA  3 NA  1  3  0 NA  0  1 NA  3  1  2  0 NA  2 NA NA  3 NA  3
 [51]  1  1  1  3  0  3  3  0  1  2  3 NA  3  2 NA  0  1 NA  3  1  0  0  1  2  0
 [76]  3  0  1  2  0  2  0  1  3  3  2  1  0  0  1  3  0  1 NA NA  3  1  2  3  3
> x_new
  [1] NA NA  1 NA  3  2  3 NA  3  3  2  3  3  1  2  3  2  3  2  2  2  3  2  3  2
 [26]  2  1  3  2  3  3  2  1  3  2  3  3  1  1  3  1  2  3  1  2  3  1  3  3  3
 [51]  1  1  1  3  3  3  3  1  1  2  3  3  3  2  1  2  1  3  3  1  1  2  1  2  3
 [76]  3  1  1  2  2  2  3  1  3  3  2  1  3  1  1  3  2  1  3  1  3  1  2  3  3

NA使用する事前情報がないため、一部の値はまだ であることに注意してください。データに十分な事前情報がある場合、これは発生しません。

于 2013-09-17T15:27:35.813 に答える