5 Stimmen

Warum erzeugt die Skalierung eine Matrix?

scale scheint eine nützliche Funktion zu sein, mit der Ausnahme, dass sie eine Matrix aus einem numerischen Vektor wie folgt erzeugt:

class(scale(mtcars$drat))
# [1] "matrix"

Gibt es eine Funktion, die einen numerischen Vektor erzeugt, ohne etwas wie as.numeric(scale(x)) tun zu müssen?

2voto

Sven Hohenstein Punkte 78380

Die Hilfeseite für ?scale besagt:

scale ist eine generische Funktion, deren Standardmethode die Spalten einer numerischen Matrix zentriert und/oder skaliert.

Wenn ein Vektor als Argument verwendet wird, wird er wie eine Matrix mit einer Spalte behandelt. Daher gibt die Funktion eine Matrix zurück.

Sie können die Matrix in einen Vektor umwandeln mit z.B. as.vector, aber in vielen Fällen können Sie mit der ein-Spalten Matrix operieren wie mit einem Vektor.

1voto

Roland Punkte 124876

Ich sehe das Problem nicht, aber du könntest einfach das hier verwenden:

res <- (mtcars$drat-mean(mtcars$drat, na.rm=TRUE))/sd(mtcars$drat, na.rm=TRUE)
res[1:3]
#[1] 0.5675137 0.5675137 0.4739996

Oder schreibe deine eigenen Methoden:

scale.numeric <- scale.integer <- function (x, center = TRUE, scale = TRUE) {
  if (is.logical(center)) {
    if (center) {
      center <- mean(x, na.rm = TRUE)
      x <- x-center
    }
  }
  else if (is.numeric(center) && (length(center) == 1)) 
    x <- x-center
  else stop("Ungültiger Wert für center")
  if (is.logical(scale)) {
    if (scale) {
      f <- function(v) {
        v <- v[!is.na(v)]
        sqrt(sum(v^2)/max(1, length(v) - 1L))
      }
      scale <- f(x)
      x <- x/scale
    }
  }
  if (is.numeric(center)) 
    attr(x, "scaled:center") <- center
  if (is.numeric(scale)) 
    attr(x, "scaled:scale") <- scale
  x
}

res <- scale(mtcars$drat)
res[1:3]
#[1] 0.5675137 0.5675137 0.4739996
class(res)
#[1] "numeric"

Oder, etwas kürzer, aber etwas weniger effizient:

scale.numeric <- scale.integer <- function (x, center = TRUE, scale = TRUE) {
  res <- scale.default(x, center, scale)
  dim(res) <- NULL
  res
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X