3

私はR初心者です。サンプルをランダム フォレストに入れる前に、外れ値のクリーニングと 0 から 1 への全体的なスケーリングを実行したいと考えています。

g<-c(1000,60,50,60,50,40,50,60,70,60,40,70,50,60,50,70,10)

0 - 1 の単純なスケーリングを行うと、結果は次のようになります。

> round((g - min(g))/abs(max(g) - min(g)),1)

 [1] 1.0 0.1 0.0 0.1 0.0 0.0 0.0 0.1 0.1 0.1 0.0 0.1 0.0 0.1 0.0 0.1 0.0

したがって、私の考えは、0.95 分位よりも大きい各列の値を、0.95 分位よりも小さい次の値に置き換えることです。0.05 分位についても同様です。

したがって、事前にスケーリングされた結果は次のようになります。

g<-c(**70**,60,50,60,50,40,50,60,70,60,40,70,50,60,50,70,**40**)

およびスケーリング:

> round((g - min(g))/abs(max(g) - min(g)),1)

 [1] 1.0 0.7 0.3 0.7 0.3 0.0 0.3 0.7 1.0 0.7 0.0 1.0 0.3 0.7 0.3 1.0 0.0

データフレーム全体にこの式が必要なので、R 内の機能的な実装は次のようになります。

> apply(c, 2, function(x) x[x`<quantile(x, 0.95)]`<-max(x[x, ... max without the quantile(x, 0.95))

誰でも助けることができますか?

余談ですが、この仕事を直接行う機能があれば教えてください。私はすでに をチェックアウトcutcut2ました。cut一意ではないブレークのために失敗します。cut2動作しますが、文字列値または平均値のみが返され、0 - 1 の数値ベクトルが必要です。

トライアル用:

a<-c(100,6,5,6,5,4,5,6,7,6,4,7,5,6,5,7,1)

b<-c(1000,60,50,60,50,40,50,60,70,60,40,70,50,60,50,70,10)

c<-cbind(a,b)

c<-as.data.frame(c)

ご協力ありがとうございます。

ライナー

4

2 に答える 2

11

これをしないでください。これは、外れ値を処理するための適切な戦略ではありません。特に、データの10%が外れ値である可能性は低いためです。

于 2011-03-12T16:05:39.343 に答える
3

これを行うRの関数は考えられませんが、小さな関数を自分で定義することはできます。

foo <- function(x)
{
    quant <- quantile(x,c(0.05,0.95))
    x[x < quant[1]] <- min(x[x >= quant[1]])
    x[x > quant[2]] <- max(x[x <= quant[2]])
    return(round((x - min(x))/abs(max(x) - min(x)),1))
}

次にsapply、これをデータフレーム内の各変数に適用します。

sapply(c,foo)
       a   b
 [1,] 1.0 1.0
 [2,] 0.7 0.7
 [3,] 0.3 0.3
 [4,] 0.7 0.7
 [5,] 0.3 0.3
 [6,] 0.0 0.0
 [7,] 0.3 0.3
 [8,] 0.7 0.7
 [9,] 1.0 1.0
[10,] 0.7 0.7
[11,] 0.0 0.0
[12,] 1.0 1.0
[13,] 0.3 0.3
[14,] 0.7 0.7
[15,] 0.3 0.3
[16,] 1.0 1.0
[17,] 0.0 0.0

編集:この回答は、プログラミングの問題を解決するためのものでした。実際に使用することに関して、私はハドリーに完全に同意します

于 2011-03-12T10:37:54.200 に答える