对所有列进行简单的z变换

时间:2012-11-02 13:11:11

标签: r transformation sapply

我刚刚在所有列的Matrix中为z转换编写了一个非常基本的函数。它看起来像这样:

sapply(MyObject, function(x){(x-mean(x))/sd(x)})

我随机检查了我的函数以查找Matrix中的某些单元格,它似乎工作正常。我仍然想确认这个功能没问题,因为我对R很新,我在互联网上找不到任何好的例子。

1 个答案:

答案 0 :(得分:4)

你应该看看为你做这件事的scale()

你的功能接近正确;您应该在na.rm = TRUEsd()函数调用中添加mean()

我会使用scale()而不是sweep()来编写(如果不使用sapply())函数。 E.g。

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"