2017-08-20 4 views
0

私は極端な値をデータセットの最も近い値に置き換えようとしています。私はifelse()がうまく動作することを知っていますが、なぜforループが動作しないのか不思議です。なぜ私のforループ関数が機能していないのですか(データセットの異常値を切り捨てようとしています)

truncate <- function(a){ 
    m <- mean(a) 
    sd <- sd(a) 
    up <- m+3*sd 
    low <- m-3*sd 
    a1 <- c() 
    for (i in 1:length(a)){ 
    if (a[i] > up) { 
     a1[i] = up 
     } 
    if (a[i] < low){ 
     a1[i] = low 
     } 
    else { 
     a1[i] = a[i] 
    } 
    } 
    return (a1) 
    } 
a <- c(1:100) 

答えて

2

forループが正しく動作しており、要素の繰り返しがです。私はあなたがtruncate()への入力としてa <- c(1:100)を与えていると仮定していて、それはちょうどaと同じ値を返すので、あなたの関数は動作していないと言います。これは、入力としてを使用した場合、up137.5345となり、の結果は-36.53448となります。値がupより大きくないか、またはlowより小さくないため、elseステートメントのみに達します。

また、forループおよび条件文でa1を生成するために使用するコピーアンドアペンドパターンは、計算コストが高くなります。ベクトル化することができ、以下のように機能を効率化することができます。

truncate <- function(a) { 
    m <- mean(a) 
    sd <- sd(a) 
    up <- m+3*sd 
    low <- m-3*sd 
    a[a > up] <- up 
    a[a < low] <- low 
    a 
} 
関連する問題