2017-06-26 7 views
1
私は使用して次のことを解決しようとしている

でのforループとrであればネストされた使用: 可能な価格のための私のデータは次のとおりです。 TEST2は、ネストされた場合であり、R

test2 <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 399, 0, 0, 399, 0, 0, 0, 0, 399, 0, 0, 0, 0, 429, 0, 429, 
0, 0, 0, 499, 0, 429, 0, 0, 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0) 

問題: 価格の最初の出現前の0を最初の出現の値で置き換え、1回目の出現後の0を2回目の出現までの1回目の出現の値と置き換えるなど。価格の最後の出現後の0は、最後の出現の値に置き換えなければならない。

priceposition2 <- which(test2>0) 
for(i in 1:length(priceposition2)){ 
for(m in 1:length(test2)){ 
    if (m <= priceposition2[1]){ 
test2[m] <- test2[priceposition2[1]] 
} else if (m > priceposition2[1]){ 
    if (m> priceposition2[i] && m < priceposition2[i+1]){ 
    test2[m] <- test2[priceposition2[i]] 

    }else if(m> priceposition2[length(priceposition2)]){ 
    test2[m] <- test2[priceposition2[length(priceposition2)]] 
    } 

} 
m=m+1 
} 
i=i+1 
} 

が、私はこの後、次の結果を得る:まさに私が欲しいものである

[1] 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 
399 399 399 399 399 
[24] 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 
399 399 399 399 399 
[47] 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 
399 399 399 399 399 399 
[70] 399 399 399 399 399 399 399 399 429 429 429 429 429 429 499 499 429 429 
429 429 429 429 529 
[93] 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 
529 529 529 529 529 
[116] 529 529 529 529 529 529 529 529 529 529 529 529 529 529 

私は、次のコードを使用しています。私が間違ってやっている何かが

Error in if (m > priceposition2[i] && m < priceposition2[i + 1]) { : 
missing value where TRUE/FALSE needed 

あります: 問題は、私は上記のコードを使用してエラーが出るのですか? 上記の問題に適用ファミリを使用する代替方法もありますか?

+0

pleseは使用dput()(priceposition2でデータ –

答えて

3

zoona.locfを使用してこれを行うことができます。基本的には、まずすべてのゼロをNAに置き換えます。次に、na.rm = FALSEna.locf転送を使用して先行するNAを維持します。先頭のNAsを最初の値に変更するには、fromLast=TRUEで後方にna.locfを使用します。

priceposition2<-c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399,0,0,399,0, 
0,0,0,399,0,0,0,0,429,0,429,0,0,0,499,0,429,0, 
0,0,0,0,529,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) 

library(zoo) 
priceposition2[priceposition2==0] <- NA 
na.locf(na.locf(priceposition2,na.rm = FALSE),fromLast=TRUE) 

    [1] 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 
[33] 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 
[65] 399 399 399 399 399 399 399 399 399 399 399 399 399 429 429 429 429 429 429 499 499 429 429 429 429 429 429 529 529 529 529 529 
[97] 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 
[129] 529 
+0

'na.locfを(共有します、ifelse(priceposition2 == 0、NA_real_、priceposition2))、fromLast = TRUE) ' – Masoud

1

あなたは間隔の境界として上記ゼロ値の位置を使用して、全体のベクトルのインデックスを横切っfindIntervalを使用することができます。その後、これらのインターバル番号を使用して、正しいゼロ値(2つのインターバルに使用される最初の値)を交換します。ベースRで

above_zero <- which(test2 > 0) 
carryover_from <- findInterval(seq_along(test2), c(0, above_zero)) 
carryover_values <- c(test2[above_zero[1]], test2[above_zero]) 
test2 <- carryover_values[carryover_from] 
3

Reducevがあなたのベクトルである)あなたが後にしている何のために適しています:

Reduce(function(x,y) ifelse(y==0, x, y), v, accumulate=TRUE, init = v[v>0][1])[-1] 
関連する問題