2017-01-25 6 views
2

データから各行の平均をとって、平均値からどれくらい距離が離れているかを調べたいと思います。パーセンテージが50より大きい場合、この値はNAに置き換えてください。平均値から未処理値を交換してください。

structure(list(Name = structure(c(18L, 19L, 5L, 13L, 14L, 31L 
), .Label = c("AMC Javelin", "Cadillac Fleetwood", "Camaro Z28", 
"Chrysler Imperial", "Datsun 710", "Dodge Challenger", "Duster 360", 
"Ferrari Dino", "Fiat 128", "Fiat X1-9", "Ford Pantera L", "Honda Civic", 
"Hornet 4 Drive", "Hornet Sportabout", "Lincoln Continental", 
"Lotus Europa", "Maserati Bora", "Mazda RX4", "Mazda RX4 Wag", 
"Merc 230", "Merc 240D", "Merc 280", "Merc 280C", "Merc 450SE", 
"Merc 450SL", "Merc 450SLC", "Pontiac Firebird", "Porsche 914-2", 
"Toyota Corolla", "Toyota Corona", "Valiant", "Volvo 142E"), class = "factor"), 
    mpg_1 = c(125, 133, 143, 141, 134, 238), cyl_1 = c(114, 153, 
    112, 136, 128, 155), disp_1 = c(113, 143, 144, 131, 431, 
    331), hp_1 = c(332, 221, 113, 331, 134, 151)), .Names = c("Name", 
"mpg_1", "cyl_1", "disp_1", "hp_1"), row.names = c(NA, 6L), class = "data.frame") 

、それは所望の出力です:

   Name mpg_1 cyl_1 disp_1 hp_1 
1   Mazda RX4 125 114 113 NA 
2  Mazda RX4 Wag 133 153 143 221 
3  Datsun 710 143 112 144 113 
4 Hornet 4 Drive 141 136 131 NA 
5 Hornet Sportabout 134 128 NA 134 
6   Valiant 238 155 331 151 

が同様に二つの条件があるデータだ

  1. 行の未処理の値は、NAに置き換えることができます。平均が完全に変化するが、第2の条件を見るので、50%カットオフを使用すると2つの値があると考えるのは難しい。
  2. カットオフ率を変更しやすいとすれば素晴らしいでしょう。私は50%を下回ってしまいます。

効果的なやり方はありますか?ループを使用すると実行可能に見えますが、より効率的な方法がありますか?

+2

これは非常に悪い考えです。しかしこれを行うには、入力ベクトルに対してこれを行い、 'apply'を使う関数を書くだけです。 – Roland

+0

@Shaxi Liverでは、行ごとに1つの値を変更したいだけで、カットオフのしきい値を可変にすることができます。それが価値あるものであれば、私はRolandと統計的には良い考えではないことに同意します。 – LAP

+0

私の特定の状況ではどのような統計的アプローチが使用できますか?どんなテストをお勧めしますか?問題は複製数です(4)。結果のいくつかは統計的に関連しているはずですが、1つの複製があるため、p値は通常はしきい値を超えています。まず、データからこれらの異常値を取り除いたときの様子をテストしたいと思います。私が「期待している」ものを見れば、私は統計的なアプローチを見つけようとします。結果が不明な場合は、1年間の作業を繰り返すことになります。 –

答えて

3

@Rolandがコメント内で言及しているように、統計的な観点から見ると、これは推奨されていません。しかし、あなたが絶対にそれをしなければならない場合、

fun1 <- function(x, n){ 
    t <- which((x - mean(x))/mean(x) > n)[1] 
    x[t] <- NA 
    return(x) 
} 

df1[-1] <- t(apply(df1[-1], 1, fun1, 0.5)) 

df1 
#    Name mpg_1 cyl_1 disp_1 hp_1 
#1   Mazda RX4 125 114 113 NA 
#2  Mazda RX4 Wag 133 153 143 221 
#3  Datsun 710 143 112 144 113 
#4 Hornet 4 Drive 141 136 131 NA 
#5 Hornet Sportabout 134 128  NA 134 
#6   Valiant 238 155  NA 151 
関連する問題