r - 为什么 R 中的 sd 返回矩阵输入的向量,我该怎么办?

标签 r

我有点困惑为什么 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/

相关文章:

r - ggplot2 Dollar_format 对大数产生科学记数法

r - Igraph:获取最长测地距离

c++ - 迭代 MappedSparseMatrix 特征中的非零元素

html - knitr Markdown LateX 类似于 HTML 文档中的表格

r - 从字符串中提取年份并附加到数据框

r - 当我改变轴位置 ggplot 停止轴标签旋转

r - 如何在 R 中的每个变量名末尾添加 "1"?

r - 用于更新 R Markdown 代码以使用 `$latex` 分隔符的命令行程序

r - 获取 Data.table 中的日期差异

javascript - textArea 的 Shiny 绑定(bind) - 无法设置初始值