为什么规模会产生矩阵?

时间:2013-11-16 08:46:36

标签: r scale

scale似乎是一个有用的函数,除了它从数字向量生成一个矩阵,如下所示:

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

是否有一个函数可以生成数字向量而无需执行as.numeric(scale(x))之类的操作?

2 个答案:

答案 0 :(得分:1)

?scale的帮助页面说:

  

scale是泛型函数,其默认方法是居中和/或缩放数字矩阵的列。

当矢量用作参数时,它被视为单列矩阵。因此,该函数返回一个矩阵。

您可以使用例如as.vector将矩阵转换为矢量,但在很多情况下,您可以使用单列矩阵进行操作,就像使用矢量操作一样。

答案 1 :(得分:1)

我没有看到问题,但你可以简单地使用它:

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

或者编写自己的方法:

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("invalid value for 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"

或者,有点短,但效率稍低:

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