2016-08-07 8 views
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 

答えて

1

あり、完全にあなたのコードで指定されていないいくつかの境界の問題がありますが、多分次のように使用することができます

x <- 1:11 
wins(x,1) 
[1] 2 2 3 4 5 6 7 8 9 10 10 
wins(x,3) 
[1] 4 4 4 4 5 6 7 8 8 8 8 
+0

申し訳ありません:

wins2 <- function(x, n=1) { xx <- sort(unique(x)) x[x<=xx[n]] <- xx[n+1] x[x>=xx[length(xx)-n]] <- xx[length(xx)-n] x } 

この収量を(基本Rを使用して、超効率的ではありません)しかし、私はどのように標準化とwinsorizingループですか?すなわち、標準化してから、winsorizeします。その後、winsorizedスコアを標準化し、次に再度winsorizedされます。あなたは絶対に正しいです!私は境界が必要です。 +/- 3 sd以上の平均値を3と置き換えるにはどうすればよいですか? p.s私は私の質問を編集する必要がありますか?このことについては全く新しいことを申し訳ありません。おかげで –

+0

あなたのコードでは、元のデータの最小値はまだ標準化した後に最小になるので、標準化の意味はありません。あなたは本質的にランクに取り組んでいますし、最後に実行した後に標準化したいだけかもしれません。たぶん、質問を言い換えて、出力がどうあるべきかを示すようにしてください。 – ekstroem

+0

私に戻ってくれてありがとう!これらの値に0から100の範囲でスコアを割り当てようとしていますが、平均は50です。また、もし意味があれば、値を正規分布に強制しようとしていますか?出力に関しては、私は手動でExcelでそれを行い、元の質問に追加した編集済みのコードでも同様の結果が得られたようです。だから私は "winsorizedスコアを標準化する"と "winsorizing"シーケンスを10回複製することを探しています。ありがとう。 –

関連する問題