2012-03-26 2 views
1

加重インデックスのスプライスの作成に問題があります。次のデータフレームを返すスプライシング加重インデックス

a=(1:10) 
b=(14:23) 
c=rep(1,10) 
wa=c(2,2,2,2,2,6,6,6,6,6) 
wb=c(5,5,5,5,5,2,2,2,2,2) 
wc=c(3,3,3,3,3,2,2,2,2,2) 
z=data.frame(a,b,c,wa,wb,wc) 
z$ind=rowSums(z[,1:3]*z[,4:6])/rowSums(z[,4:6]) 

a b c wa wb wc ind 
1 1 14 1 2 5 3 7.5 
2 2 15 1 2 5 3 8.2 
3 3 16 1 2 5 3 8.9 
4 4 17 1 2 5 3 9.6 
5 5 18 1 2 5 3 10.3 
6 6 19 1 6 2 2 7.6 
7 7 20 1 6 2 2 8.4 
8 8 21 1 6 2 2 9.2 
9 9 22 1 6 2 2 10.0 
10 10 23 1 6 2 2 10.8 

重みは(WA、WB、WC)がレコード6で変更されている私は、次のサンプルデータを有します。だから、7.6が11になるように、レコード6にインデックスをスプライスしたいと思います。前のレコードの重みで値(a、b、c)を計算し、それを7.6で割り算する必要があります。その後、重みが再び変化するまで、それを次のすべての数値に適用します。それは1の値を返します

changeWeight=function(x){ 
for(i in 2:NROW(z)) { 
z$test[i] <- if(z$wa[i]-z$wa[i-1]==0) 0 else 1 
} 
z 
} 

は重量がそうのように変更されているところはどこでも:

a b c wa wb wc ind test 
1 1 14 1 2 5 3 7.5 NA 
2 2 15 1 2 5 3 8.2 0 
3 3 16 1 2 5 3 8.9 0 
4 4 17 1 2 5 3 9.6 0 
5 5 18 1 2 5 3 10.3 0 
6 6 19 1 6 2 2 7.6 1 
7 7 20 1 6 2 2 8.4 0 
8 8 21 1 6 2 2 9.2 0 
9 9 22 1 6 2 2 10.0 0 
10 10 23 1 6 2 2 10.8 0 

は、今、私が作成しようとした次の関数は、私は私の重みのいずれかが変更されている場所を見つけることができます値6は、インデックス6にインデックスをスプライスするために乗算されます。私は、次のことを試してみました:

spliceValue=function(x){ 
for(i in 2:NROW(z)){ 
z$splice[i]=if(z$test[i]==1&z$splice[i-1]!=NA) (rowSums(z[i,1:3]*z[i-1,4:6])/rowSums(z[i-1,4:6]))/z$ind[i] else z$splice[i-1] 
} 
z 
} 

しかし、それは、このエラーを返します:

Error in if (z$test[i] == 1 & z$splice[i - 1] != NA) z$ind[i - 1]/z$ind[i] else z$splice[i - : 
argument is of length zero 

私は何を取得したいと思いことはこれです:その後、私はスプライスによってIND掛けると持つことができます

a b c wa wb wc ind test splice 
1 1 14 1 2 5 3 7.5 NA  NA 
2 2 15 1 2 5 3 8.2 0 0.000000 
3 3 16 1 2 5 3 8.9 0 0.000000 
4 4 17 1 2 5 3 9.6 0 0.000000 
5 5 18 1 2 5 3 10.3 0 0.000000 
6 6 19 1 6 2 2 7.6 1 1.447638 
7 7 20 1 6 2 2 8.4 0 1.447638 
8 8 21 1 6 2 2 9.2 0 1.447638 
9 9 22 1 6 2 2 10.0 0 1.447638 
10 10 23 1 6 2 2 10.8 0 1.447638 

素晴らしい円滑なインデックス。重みに複数の変更有すること一例を拡大

+0

'changeWeight'関数に注意してください。どの環境で 'z $ test'を作成していますか?どのような環境でお持ちになりたいですか? – BenBarnes

+0

私はあなたの 'spliceValue'関数で' $ $ plice [i-1] 'を持っているという私のコメントを削除しましたが、それは過度に面倒な削除でした。 'pliceValue'を実行する前に 'splice'という名前の' z'列を定義し、上記のコメントと組み合わせて、よりスムーズに進むべきです。 – BenBarnes

+0

インデックスに複数の重量変化がある場合は、適切にスプライスする方法があります。[ここ](http://stackoverflow.com/questions/10543199/splicing-weighted-index-and-getting-a-smooth-value) 。 – thequerist

答えて

1

:ここ

a=(1:15) 
b=(14:28) 
c=rep(1,15) 
wa=c(2,2,2,2,2,6,6,6,6,6,5,5,5,5,5) 
wb=c(5,5,5,5,5,2,2,2,2,2,6,6,6,6,6) 
wc=c(3,3,3,3,3,2,2,2,2,2,3,3,3,3,3) 
z=data.frame(a,b,c,wa,wb,wc) 
z$ind=rowSums(z[,1:3]*z[,4:6])/rowSums(z[,4:6]) 

は、私がデータに付加することができるベクターを返すように機能changeWeight()spliceValue()を変更しました。これは、拡張された例題に対して必要なことを行い、元の関数で発生する可能性のある環境問題を回避します。

changeWeight<-function(x){ 
    test <- NA 
    for(i in 2:NROW(z)) { 
    test[i] <- if(z$wa[i]-z$wa[i-1]==0) 0 else 1 
    } 
    return(test) 
} 

z$test<-changeWeight() 

条件z$splice[i - 1]!=NAは不必要と思われた。そうでない場合は、代わりに!is.na(z$splice[i - 1])を考慮する必要があります。

spliceValue <- function(x) { 
    splice <- 0 
    for(i in 2:NROW(z)) { 
    splice[i] <- if(z$test[i]==1) (rowSums(z[i,1:3]*z[i-1,4:6])/rowSums(z[i-1,4:6]))/z$ind[i] else splice[i-1] 
    } 
    return(splice) 
} 
z$splice<-spliceValue() 

そして、元の例の通り、zは、多くの行がある場合、この方法は時間がかかる場合があり、注意点として

z$splice[1]<-NA 

、NAにz$spliceの最初の値を設定します。

関連する問題