2012-05-10 1 views
0

私はthis質問をしばらく前に受け取りました。答えは私には満足でした。しかし、私はコードを書き換えたので、私は新しい問題があります。ここで加重指数をスプライスしてスムーズな値を得る

はデータです:

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

その後、我々は、これら2つの機能を実行します。

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() 

そして:だからここ

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() 

を、それが問題になるところです。 、

a b c wa wb wc ind test splice spind 
1 1 14 1 2 5 3 7.5 NA 0.0000000 7.50000 
2 2 15 1 2 5 3 8.2 0 0.0000000 8.20000 
3 3 16 1 2 5 3 8.9 0 0.0000000 8.90000 
4 4 17 1 2 5 3 9.6 0 0.0000000 9.60000 
5 5 18 1 2 5 3 10.3 0 0.0000000 10.30000 
6 6 19 1 6 2 2 7.6 1 1.4473684 11.00000 
7 7 20 1 6 2 2 8.4 0 1.4473684 12.15789 
8 8 21 1 6 2 2 9.2 0 1.4473684 13.31579 
9 9 22 1 6 2 2 10.0 0 1.4473684 14.47368 
10 10 23 1 6 2 2 10.8 0 1.4473684 15.63158 
11 11 24 1 5 1 4 8.3 1 1.3975904 11.60000 
12 12 25 1 5 1 4 8.9 0 1.3975904 12.43855 
13 13 26 1 5 1 4 9.5 0 1.3975904 13.27711 
14 14 27 1 5 1 4 10.1 0 1.3975904 14.11566 
15 15 28 1 5 1 4 10.7 0 1.3975904 14.95422 
16 16 29 1 2 6 2 20.8 1 0.5432692 11.30000 
17 17 30 1 2 6 2 21.6 0 0.5432692 11.73462 
18 18 31 1 2 6 2 22.4 0 0.5432692 12.16923 
19 19 32 1 2 6 2 23.2 0 0.5432692 12.60385 
20 20 33 1 2 6 2 24.0 0 0.5432692 13.03846 
21 21 34 1 2 6 2 24.8 0 0.5432692 13.47308 
22 22 35 1 2 6 2 25.6 0 0.5432692 13.90769 
23 23 36 1 2 6 2 26.4 0 0.5432692 14.34231 
24 24 37 1 2 6 2 27.2 0 0.5432692 14.77692 
25 25 38 1 2 6 2 28.0 0 0.5432692 15.21154 
26 26 39 1 2 6 2 28.8 0 0.5432692 15.64615 
27 27 40 1 2 6 2 29.6 0 0.5432692 16.08077 
28 28 41 1 2 6 2 30.4 0 0.5432692 16.51538 
29 29 42 1 2 6 2 31.2 0 0.5432692 16.95000 
30 30 43 1 2 6 2 32.0 0 0.5432692 17.38462 
31 31 44 1 0 5 5 22.5 1 1.4577778 32.80000 
32 32 45 1 0 5 5 23.0 0 1.4577778 33.52889 
33 33 46 1 0 5 5 23.5 0 1.4577778 34.25778 
34 34 47 1 0 5 5 24.0 0 1.4577778 34.98667 
35 35 48 1 0 5 5 24.5 0 1.4577778 35.71556 
36 36 49 1 0 5 5 25.0 0 1.4577778 36.44444 
37 37 50 1 0 5 5 25.5 0 1.4577778 37.17333 
38 38 51 1 0 5 5 26.0 0 1.4577778 37.90222 
39 39 52 1 0 5 5 26.5 0 1.4577778 38.63111 
40 40 53 1 0 5 5 27.0 0 1.4577778 39.36000 
41 41 54 1 1 0 9 5.0 1 5.5000000 27.50000 
42 42 55 1 1 0 9 5.1 0 5.5000000 28.05000 
43 43 56 1 1 0 9 5.2 0 5.5000000 28.60000 
44 44 57 1 1 0 9 5.3 0 5.5000000 29.15000 
45 45 58 1 1 0 9 5.4 0 5.5000000 29.70000 
46 46 59 1 1 0 9 5.5 0 5.5000000 30.25000 
47 47 60 1 1 0 9 5.6 0 5.5000000 30.80000 
48 48 61 1 1 0 9 5.7 0 5.5000000 31.35000 
49 49 62 1 1 0 9 5.8 0 5.5000000 31.90000 
50 50 63 1 1 0 9 5.9 0 5.5000000 32.45000 

だからz$spindは10レコードまでの罰金ですが、レコードの11で何の円滑な移行の重みがありません(WA:

z$spind=ifelse(z$splice==0,z$ind,z$splice*z$ind) 

と、次のデータフレームを取得する:私はこれを実行しますwb、wc)が変化する。なぜなら、私のspliceValue関数はz$indで割っています。これは、最初のスプライスレコード6が平滑化インデックスz$spindと一致しないためです。そのため、その後に実行されるspliceValue関数は、間違った番号を返します。私はいくつかの重さの変更を回避する方法を作成しました。

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

spliceiValue <- function(x) { 
    splice <- 0 
    for(i in 2:NROW(z)) { 
    splice[i] <- if(z$test[i]==1) (z$splicet[i])/z$ind[i] else splice[i-1] 
    } 
    return(splice) 
} 
z$splice<-spliceiValue() 

z$spind=ifelse(z$splice==0,z$ind,z$splice*z$ind) 

私の唯一の問題は、今、このコード全体が回z$test==1の数より1つの少ない時間を実行する必要があるということです。

z$test==1と入力すると、xx=sum(z$test,na.rm=T)と表示されます。今、私は私の最終的な結果は次のようになりますように、反復ループに上記のコードをラップする方法がわからない:Zの$のspindは重みが変更されたときはいつでも、巨大なスパイクを持っていないか

a b c wa wb wc ind test splice spind splicet 
1 1 14 1 2 5 3 7.5 NA 0.000000 7.50000 0.00000 
2 2 15 1 2 5 3 8.2 0 0.000000 8.20000 8.20000 
3 3 16 1 2 5 3 8.9 0 0.000000 8.90000 8.90000 
4 4 17 1 2 5 3 9.6 0 0.000000 9.60000 9.60000 
5 5 18 1 2 5 3 10.3 0 0.000000 10.30000 10.30000 
6 6 19 1 6 2 2 7.6 1 1.447368 11.00000 11.00000 
7 7 20 1 6 2 2 8.4 0 1.447368 12.15789 12.15789 
8 8 21 1 6 2 2 9.2 0 1.447368 13.31579 13.31579 
9 9 22 1 6 2 2 10.0 0 1.447368 14.47368 14.47368 
10 10 23 1 6 2 2 10.8 0 1.447368 15.63158 15.63158 
11 11 24 1 5 1 4 8.3 1 2.022828 16.78947 16.78947 
12 12 25 1 5 1 4 8.9 0 2.022828 18.00317 18.00317 
13 13 26 1 5 1 4 9.5 0 2.022828 19.21687 19.21687 
14 14 27 1 5 1 4 10.1 0 2.022828 20.43056 20.43056 
15 15 28 1 5 1 4 10.7 0 2.022828 21.64426 21.64426 
16 16 29 1 2 6 2 20.8 1 1.098940 22.85796 22.85796 
17 17 30 1 2 6 2 21.6 0 1.098940 23.73711 23.73711 
18 18 31 1 2 6 2 22.4 0 1.098940 24.61626 24.61626 
19 19 32 1 2 6 2 23.2 0 1.098940 25.49541 25.49541 
20 20 33 1 2 6 2 24.0 0 1.098940 26.37457 26.37457 
21 21 34 1 2 6 2 24.8 0 1.098940 27.25372 27.25372 
22 22 35 1 2 6 2 25.6 0 1.098940 28.13287 28.13287 
23 23 36 1 2 6 2 26.4 0 1.098940 29.01202 29.01202 
24 24 37 1 2 6 2 27.2 0 1.098940 29.89118 29.89118 
25 25 38 1 2 6 2 28.0 0 1.098940 30.77033 30.77033 
26 26 39 1 2 6 2 28.8 0 1.098940 31.64948 31.64948 
27 27 40 1 2 6 2 29.6 0 1.098940 32.52863 32.52863 
28 28 41 1 2 6 2 30.4 0 1.098940 33.40778 33.40778 
29 29 42 1 2 6 2 31.2 0 1.098940 34.28694 34.28694 
30 30 43 1 2 6 2 32.0 0 1.098940 35.16609 35.16609 
31 31 44 1 0 5 5 22.5 1 1.602011 36.04524 36.04524 
32 32 45 1 0 5 5 23.0 0 1.602011 36.84625 36.84625 
33 33 46 1 0 5 5 23.5 0 1.602011 37.64725 37.64725 
34 34 47 1 0 5 5 24.0 0 1.602011 38.44826 38.44826 
35 35 48 1 0 5 5 24.5 0 1.602011 39.24926 39.24926 
36 36 49 1 0 5 5 25.0 0 1.602011 40.05027 40.05027 
37 37 50 1 0 5 5 25.5 0 1.602011 40.85127 40.85127 
38 38 51 1 0 5 5 26.0 0 1.602011 41.65228 41.65228 
39 39 52 1 0 5 5 26.5 0 1.602011 42.45328 42.45328 
40 40 53 1 0 5 5 27.0 0 1.602011 43.25429 43.25429 
41 41 54 1 1 0 9 5.0 1 8.811059 44.05530 44.05530 
42 42 55 1 1 0 9 5.1 0 8.811059 44.93640 31.04697 
43 43 56 1 1 0 9 5.2 0 8.811059 45.81751 31.65573 
44 44 57 1 1 0 9 5.3 0 8.811059 46.69861 32.26450 
45 45 58 1 1 0 9 5.4 0 8.811059 47.57972 32.87326 
46 46 59 1 1 0 9 5.5 0 8.811059 48.46082 33.48202 
47 47 60 1 1 0 9 5.6 0 8.811059 49.34193 34.09079 
48 48 61 1 1 0 9 5.7 0 8.811059 50.22304 34.69955 
49 49 62 1 1 0 9 5.8 0 8.811059 51.10414 35.30832 
50 50 63 1 1 0 9 5.9 0 8.811059 51.98525 35.91708 

注意。これは適切にスプライシングされたインデックスです。これは、重みが5回変更されたので、上記コードの4回の反復が必要でした。私は、反復ループのいくつかの並べ替えでそのコードをラップしたいと思い、これは私が思い付いたものですが、私のRのスキルが限られているとして、それは無益な試みです:

xx=sum(z$test,na.rm=T) 

fixValue = function(y) { 
    for(q in 1:xx-1) { 

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

    spliceiValue <- function(x) { 
     splice <- 0 
     for(i in 2:NROW(z)) { 
     splice[i] <- if(z$test[i]==1) (z$splicet[i])/z$ind[i] else splice[i-1] 
     } 
     return(splice) 
    } 
    z$splice<-spliceiValue() 

    z$spind=ifelse(z$splice==0,z$ind,z$splice*z$ind) 

    } 
} 

は私が間違って何をしているのですか?

答えて

1

あなたのコードは、いくつかのより向上させることができたが、あなたはそれを動作させるために逃した唯一の事があります:

xx=sum(z$test,na.rm=T) 

fixValue = function() { ## argument is not needed 
    for(q in 1:xx-1) { 

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

    spliceiValue <- function(x) { 
     splice <- 0 
     for(i in 2:NROW(z)) { 
     splice[i] <- if(z$test[i]==1) (z$splicet[i])/z$ind[i] else splice[i-1] 
     } 
     return(splice) 
    } 
    z$splice<-spliceiValue() 

    z$spind=ifelse(z$splice==0,z$ind,z$splice*z$ind) 

    } 
return(z) ## this one 
} 
fixValue() 
+0

@thequeristは、今、あなたのためにこの仕事をしますか? – Julius

+0

私が必要としたもの。 – thequerist

関連する問題