scale
似乎是一个有用的函数,除了它从数字向量生成一个矩阵,如下所示:
class(scale(mtcars$drat))
# [1] "matrix"
是否有一个函数可以生成数字向量而无需执行as.numeric(scale(x))
之类的操作?
答案 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
}