2013-03-29 7 views
6

Ich versuche, eine Daten.Frame im Bereich von 0 und 1 mit dem folgenden Code skalieren:Scaling Daten in R gibt unrichtige Fehler "Länge von 'center' muss gleich der Anzahl der Spalten von 'x'"

for(i in 1:nrow(data)) 
{ 
    x <- data[i, ] 
    data[i, ] <- scale(x, min(x), max(x)-min(x)) 
} 

Data: 
x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 
15 6 6 0 9 3 1 4 5 1 1 13 0 0 20 5 28 
2 24 14 7 0 15 7 0 11 3 3 4 15 7 0 30 0 344 
3 10 5 2 0 6 2 0 5 0 0 2 7 1 0 11 0 399 
4 9 4 2 0 5 2 0 4 0 0 2 6 1 0 10 0 28 
5 6 2 1 0 3 1 0 2 0 0 1 3 1 0 6 0 82 
6 9 4 2 0 5 2 0 4 0 0 2 6 1 0 10 0 42 

Aber ich erhalte die folgende Fehlermeldung:

Error in scale.default(x, min(x), max(x) - min(x)) (from #4) : 
    length of 'center' must equal the number of columns of 'x' 

Antwort

8

diese Daten verwenden, Ihr Beispiel funktioniert für mich:

data <- matrix(sample(1:1000,17*6), ncol=17,nrow=6) 
for(i in 1:nrow(data)){ 
    x <- data[i, ] 
    data[i, ] <- scale(x, min(x), max(x)-min(x)) 
} 

Hier eine weitere Option mit Skala, ohne Schleife. Sie müssen nur eine scale und eine center mit den gleichen Spalten, die Ihre Matrix bereitstellen.

maxs <- apply(data, 2, max)  
mins <- apply(data, 2, min) 
scale(data, center = mins, scale = maxs - mins) 

EDIT wie das Ergebnis zu gelangen.

Die Skala gibt eine Matrix mit 2 Attributen zurück. Um einen data.frame zu erhalten, müssen Sie das Skalierergebnis lediglich in einen data.frame umwandeln.

dat.scale <- scale(data, center = mins, scale = maxs - mins) 
dat.sacle <- as.data.frame(dat.scale) 
+1

Dank in R. zu tun. Aber wenn ich die Ausgabe der Skalierungsfunktion einer Variablen zuweise, kann ich den Datenteil nicht extrahieren. Ich denke, es gibt einige andere Attribute in der Ausgabe von der Maßstabsfunktion. – Shahzad

+0

@Shahzad Ihre Daten sind eine Matrix mit 2 zusätzlichen Attributen. Sie können zum Beispiel 'as.vector (data)' verwenden, um sie zu entfernen. – agstudy

+0

@Shahzad sind sie wirklich im Weg? Sie können 'attributes (x) <- list (dim = dim (x)) verwenden' –

4

Die center und scale Argumente scale muss Länge gleich der Anzahl der Spalten in x haben. Es sieht aus wie data ist ein data.frame, so dass Ihre x hat so viele Spalten wie Ihre data.frame tut und damit den Konflikt. Sie können über diese snag drei Arten erhalten:

  • Drop die Zeile in einem Atomvektor vor dem scale vorbei (die es als eine einzige Spalte behandeln): scale(as.numeric(x), ...)
  • konvertieren data in eine matrix, die Reihe fällt Extraktionen in Atomvektoren automatisch.
  • Verwendung @ die agstudy apply Vorschlag, das anzeigt, ob funktionieren würde, es ist ein data.frame oder ein matrix und ist wohl der „richtige“ Weg, dies
+1

+1 für den data.frame rate !! das ist nicht ersichtlich. – agstudy

+1

@agstudy danke. Die Spaltennamen waren ein Give-Away. –