我有点困惑为什么 sd
R 中的函数返回矩阵输入的数组(我想保持向后兼容性,它总是会)。这对我来说是非常奇怪的行为:
#3d input, same same
print(length(mean(array(rnorm(60),dim=c(3,4,5)))))
print(length(sd(array(rnorm(60),dim=c(3,4,5)))))
#1d input, same same
print(length(mean(array(rnorm(60),dim=c(60)))))
print(length(sd(array(rnorm(60),dim=c(60)))))
#2d input, different!
print(length(mean(array(rnorm(60),dim=c(12,5)))))
print(length(sd(array(rnorm(60),dim=c(12,5)))))
我得到
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 5
即
sd
行为与 mean
不同当输入是二维数组时(显然只有在这种情况下!)考虑一下,这个失败的函数通过标准偏差重新缩放 k 维数组的每一列:re.scale <- function(x) {
#rescale by the standard deviation of each column
scales <- apply(x,2,sd)
ret.val <- sweep(x,2,scales,"/")
}
#this works just fine
x <- array(rnorm(60),dim=c(12,5))
y <- re.scale(x)
#this throws a warning
x <- array(rnorm(60),dim=c(3,4,5))
y <- re.scale(x)
是否有其他功能可以替代
sd
没有这种奇怪的行为?怎么写re.scale
适本地?还是 Z-score-by-column 函数?
最佳答案
它在 sd 的帮助页面中表现为文档。它在最顶端宣布:
“如果 x 是矩阵或数据框,则返回列标准差的向量。”
请注意,它并没有说包含数组,因此只包含二维数组。如果您想停止这种行为,那么只需使用 c() 从中创建一个向量即可:
sd( c(array(rnorm(60),dim=c(12,5))) )
# [1] 0.9505643
我看到您添加了对 z 列分数的请求。试试这个矩阵:
colMeans(x)/sd(x)
这对于数组(尽管“列”的定义可能需要澄清:
apply(x, 2:3, mean)/apply(x, 2:3, sd) # will generalize to higher dimensions
关于r - 为什么 R 中的 sd 返回矩阵输入的向量,我该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7136239/