2016-08-07 24 views
1

Ich versuche, diese Folge von Schritten in r für einen Datenrahmen zu wiederholen. Hier ist meine Daten:Schleife eine Sequenz in R (standardisieren und Winsorize Datenrahmen)

ID Height Weight  
a 100 80  
b 80 90  
c na 70  
d 120 na  
.... 

Hier ist mein Code so weit

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) 

, was ich versuche, dies zu tun ist: -> Standardisieren ein Datenrahmen, dann winsorize die standardisierte Datenrahmen mit der Funktion winsorize2, dh die extremsten Werte werden durch die zweitniedrigsten Werte ersetzt. Dies wird dann 10 mal wiederholt. Wie mache ich eine Schleife dafür? Ich bin verwirrt wie in der Sequenz ive bereits ersetzt die Nas mit 0s und so sollte ich diesen Schritt aus der Schleife zu entfernen?

bearbeiten: Nach dem Gespräch mit @ekstroem, haben wir beschlossen, den Code zu ändern, um die Grenzen

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 

Antwort

1

Es gibt einige Grenzfragen einzuführen, die in Ihrem Code nicht vollständig spezifiziert sind, aber vielleicht können die folgenden verwendet werden (unter Verwendung von Basis R und nicht sehr effizient)

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 
} 

Dies ergibt:

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

Entschuldigung aber ich meinte, wie schleife ich die Standardisierung und Winsorisierung? dh Standardize, dann winsorize. Dann standardisieren Sie die gewichteten Punkte und diese werden dann erneut gewichtet. Und du hast absolut recht! Ich brauche eine Grenze. Wie ersetze ich diese mit mehr als +/- 3 sd vom Mittelwert mit 3? Soll ich meine Frage bearbeiten? Tut mir leid, ziemlich neu. Danke –

+0

Mit Ihrem Code gibt es wirklich keinen Sinn in der Standardisierung, da der kleinste Wert in den Originaldaten nach der Standardisierung immer noch am kleinsten ist. Du arbeitest im Wesentlichen an Rängen und möchtest vielleicht nur nach dem letzten Lauf standardisieren? Vielleicht versuchen Sie die Frage so umzuformulieren, dass auch angezeigt wird, was die Ausgabe sein soll? – ekstroem

+0

Vielen Dank für Ihre Rückmeldung! Ich versuche, diesen Werten eine Punktzahl von 0 bis 100 zuzuweisen, wobei 50 der Mittelwert ist. Ich versuche auch, die Werte in eine normale Verteilung zu zwingen, wenn das Sinn macht? Was die Ausgabe angeht, habe ich es manuell in Excel gemacht und der bearbeitete Code, den ich meiner ursprünglichen Frage hinzugefügt habe, scheint ähnliche Ergebnisse zu liefern. Also ich versuche nur, die "Standardisierung der winsorized Scores" und "Winsorizing" Sequenz für 10 mal zu replizieren. Vielen Dank. –