4

私はRに慣れていないので、他の人の質問で必要なものを見つけるのに苦労しています。私の質問はとても簡単なので、他の誰もわざわざ質問することはないと思います。

特定の変数で、条件内で単変量の外れ値(条件の平均から3 SDである点として定義している)であるデータを除外する新しいデータフレームを作成するための最も簡単なコードは何でしょうか?

私が試したことを示すのは恥ずかしいですが、ここにあります

greaterthan <- mean(dat$var2[dat$condition=="one"]) + 
               2.5*(sd(dat$var2[dat$condition=="one"]))
lessthan    <- mean(dat$var2[dat$condition=="one"]) -
               2.5*(sd(dat$var2[dat$condition=="one"]))   

withoutliersremovedone1 <-dat$var2[dat$condition=="one"] < greaterthan

そして、私はすでにそこに立ち往生しています。

ありがとう

4

2 に答える 2

7
> dat <- data.frame(
                    var1=sample(letters[1:2],10,replace=TRUE),
                    var2=c(1,2,3,1,2,3,102,3,1,2)
                   )
> dat
   var1 var2
1     b    1
2     a    2
3     a    3
4     a    1
5     b    2
6     b    3
7     a  102 #outlier
8     b    3
9     b    1
10    a    2

ここで、問題の変数の から2 個のolute!より大きくない ( ) 行のみを返します。明らかに 2 をカットオフにしたい数に変更します。abssdmeansd

> dat[!(abs(dat$var2 - mean(dat$var2))/sd(dat$var2)) > 2,]
   var1 var2
1     b    1
2     a    2
3     a    3
4     a    1
5     b    2
6     b    3 # no outlier
8     b    3 # between here
9     b    1
10    a    2

または、scale関数を使用してより簡単に:

dat[!abs(scale(dat$var2)) > 2,]

   var1 var2
1     b    1
2     a    2
3     a    3
4     a    1
5     b    2
6     b    3
8     b    3
9     b    1
10    a    2

編集

これは、次を使用してグループ内を検索するように拡張できます。by

do.call(rbind,by(dat,dat$var1,function(x) x[!abs(scale(x$var2)) > 2,] ))

dat$var1これは、各行が属するグループを定義する変数であると想定しています。

于 2013-01-30T04:04:20.077 に答える
4

このタスクには、 robustHDパッケージのwinsorize()関数を使用します。以下にその例を示します。

R> example(winsorize)

winsrzR> ## generate data
winsrzR> set.seed(1234)     # for reproducibility

winsrzR> x <- rnorm(10)     # standard normal

winsrzR> x[1] <- x[1] * 10  # introduce outlier

winsrzR> ## winsorize data
winsrzR> x
 [1] -12.070657   0.277429   1.084441  -2.345698   0.429125   0.506056  
 [7]  -0.574740  -0.546632  -0.564452  -0.890038

winsrzR> winsorize(x)
 [1] -3.250372  0.277429  1.084441 -2.345698  0.429125  0.506056 
 [7] -0.574740 -0.546632 -0.564452 -0.890038

winsrzR>

これはデフォルトで中央値 +/- 2 mad ですが、平均値 +/- 3 sd のパラメーターを設定できます。

于 2013-01-30T03:52:47.807 に答える