我刚刚为所有列的矩阵中的 z 转换编写了一个非常基本的函数。它看起来像这样:
sapply(MyObject, function(x){(x-mean(x))/sd(x)})
我随机检查了矩阵中某些单元格的函数,它似乎工作正常。我仍然想确认这个功能是好的,因为我对 R 很陌生,我在互联网上找不到任何好的例子。
我刚刚为所有列的矩阵中的 z 转换编写了一个非常基本的函数。它看起来像这样:
sapply(MyObject, function(x){(x-mean(x))/sd(x)})
我随机检查了矩阵中某些单元格的函数,它似乎工作正常。我仍然想确认这个功能是好的,因为我对 R 很陌生,我在互联网上找不到任何好的例子。
你应该看看scale()
哪个为你做这件事。
您的功能接近正确;您应该添加na.rm = TRUE
到sd()
和mean()
函数调用中。
我会写(如果不使用scale()
)函数使用sweep()
而不是sapply()
. 例如
ztran <- function(x, na.rm = TRUE) {
mns <- colMeans(x, na.rm = na.rm)
sds <- apply(x, 2, sd, na.rm = na.rm)
x <- sweep(x, 2, mns, "-")
x <- sweep(x, 2, sds, "/")
x
}
在使用中我们有
> df <- data.frame(matrix(1:9, ncol = 3))
> ztran(df)
X1 X2 X3
1 -1 -1 -1
2 0 0 0
3 1 1 1
> scale(df)
X1 X2 X3
[1,] -1 -1 -1
[2,] 0 0 0
[3,] 1 1 1
attr(,"scaled:center")
X1 X2 X3
2 5 8
attr(,"scaled:scale")
X1 X2 X3
1 1 1
sweep
对于此类操作,它是一个非常有用的矢量化工具。另请注意,这sapply()
简化为矩阵,这可能不是您想要的。sweep()
不这样做:
> class(ztran(df))
[1] "data.frame"
> class(sapply(df, function(x){(x-mean(x))/sd(x)}))
[1] "matrix"