1
私は、この一連のステップをデータフレームに対してrでループしようとしています。ここ は私のデータである。ここではRでシーケンスをループする(データフレームを標準化してWinsorizeする)
ID Height Weight
a 100 80
b 80 90
c na 70
d 120 na
....
は私のコードは、私が何をしようとしているこれまでのところ
winsorize2 <- function(x) {
Min <- which(x == min(x))
Max <- which(x == max(x))
ord <- order(x)
x[Min] <- x[ord][length(Min)+1]
x[Max] <- x[ord][length(x)-length(Max)]
x}
df<-read.csv("data.csv")
df2 <- scale(df[,-1], center = TRUE, scale = TRUE)
id<-df$Type
full<-data.frame(id,df2)
full[is.na(full)] <- 0
full[, -1] <- sapply(full[,-1], winsorize2)
でこのされます。 - >関数を使用して、標準化されたデータフレームをウィンザライズ、その後、データフレームを標準化winsorize2、すなわち、最も極端な値を2番目に小さい極値に置き換えます。これを10回繰り返す。どのように私はこれのためのループを行うのですか?私はシーケンスiveで混乱しているので、すでに0でnasを置き換えたので、私もループからこの手順を削除する必要がありますか?
編集:@ekstroemとの議論の後、我々は境界を紹介するコードに変更することを決めた
df<-read.csv("data.csv")
id<-df$Type
df2<- scale(df[,-1], center = TRUE, scale = TRUE)
df2[is.na(df2)] <- 0
df2[df2<=-3] = -3
df2[df2>=3] = 3
df3<-df2 #trying to loop again
df3<- scale(df3, center = TRUE, scale = TRUE)
df3[is.na(df3)] <- 0
df3[df3<=-3] = -3
df3[df3>=3] = 3
申し訳ありません:
この収量を(基本Rを使用して、超効率的ではありません)しかし、私はどのように標準化とwinsorizingループですか?すなわち、標準化してから、winsorizeします。その後、winsorizedスコアを標準化し、次に再度winsorizedされます。あなたは絶対に正しいです!私は境界が必要です。 +/- 3 sd以上の平均値を3と置き換えるにはどうすればよいですか? p.s私は私の質問を編集する必要がありますか?このことについては全く新しいことを申し訳ありません。おかげで –
あなたのコードでは、元のデータの最小値はまだ標準化した後に最小になるので、標準化の意味はありません。あなたは本質的にランクに取り組んでいますし、最後に実行した後に標準化したいだけかもしれません。たぶん、質問を言い換えて、出力がどうあるべきかを示すようにしてください。 – ekstroem
私に戻ってくれてありがとう!これらの値に0から100の範囲でスコアを割り当てようとしていますが、平均は50です。また、もし意味があれば、値を正規分布に強制しようとしていますか?出力に関しては、私は手動でExcelでそれを行い、元の質問に追加した編集済みのコードでも同様の結果が得られたようです。だから私は "winsorizedスコアを標準化する"と "winsorizing"シーケンスを10回複製することを探しています。ありがとう。 –