首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何逐个访问矩阵的所有列以在R中进行归一化

如何逐个访问矩阵的所有列以在R中进行归一化
EN

Stack Overflow用户
提问于 2014-08-08 02:06:25
回答 3查看 694关注 0票数 0

我有一个矩阵,看起来像这样:

代码语言:javascript
运行
复制
Col1| Col2| Col3 | Col4 | Col4 | ....
    |     |      |      |      | ....
    |     |      |      |      | ....

我想在0,1范围内逐列归一化值,我知道归一化的公式是:

代码语言:javascript
运行
复制
normalized = (x-min(x))/(max(x)-min(x))

其中x是要归一化的向量或值。如何为矩阵的每一列一次一个地执行此过程,而不必指定列名,并手动为R.Also中的每一列执行此过程。我希望插入回归一化值,从而在相同的旧矩阵中复制较早的值或形成新矩阵。我的意思是我想要这样的东西:

代码语言:javascript
运行
复制
for(each column of matrix mat)
{
//do the normalization of values for that column
//insert back normalized values at the same location in the old matrix or form a new matrix and insert there 
}

我是R的新手,因此我对R.Any中的复杂计算没有太多的了解,提前获得帮助对me.Thanks来说是很棒的!!

EN

回答 3

Stack Overflow用户

发布于 2014-08-08 02:19:54

您可以使用apply()函数

代码语言:javascript
运行
复制
apply(youdataframe, MARGIN = 2, FUN = function (x) (x-min(x))/(max(x)-min(x)))
票数 0
EN

Stack Overflow用户

发布于 2014-08-08 03:13:26

您可以使用scale函数,该函数将从每列中减去一个常量,然后将每列除以一个常量。默认值是减去平均值并除以标准差,但是如果您将最小值作为center,最大值和最小值之间的差值作为scale,那么它将按列归一化为0,1范围:

代码语言:javascript
运行
复制
newmat <- scale( oldmat, center=apply(oldmat, 2, min), 
     scale = apply(oldmat, 2, max) - apply(oldmat, 2, min) )
票数 0
EN

Stack Overflow用户

发布于 2014-08-08 03:17:10

下面的代码是素食包( function decostand()的一部分)中的代码,它说明了在使这样一个函数变得健壮时可能需要采取的一些额外步骤。它还演示了快速(-ish) sweep()函数,在这种情况下,为了支持apply(),该函数经常被忽略。

代码语言:javascript
运行
复制
norm <- function(x, na.rm = FALSE) {
  if (wasDF <- is.data.frame(x)) {
    x <- as.matrix(x)
  }
  mins <- apply(x, 2, min, na.rm = na.rm)
  maxs <- apply(x, 2, max, na.rm = na.rm)
  ran <- maxs - mins
  ran <- pmax(.Machine$double.eps, ran, na.rm = na.rm)
  x <- sweep(x, 2, mins, "-")
  x <- sweep(x, 2, ran, "/")
  if (wasDF) {
    as.data.frame(x)
  }
  x
}

在使用中,这提供了:

代码语言:javascript
运行
复制
set.seed(1)
mat <- matrix(rnorm(100), ncol = 10)
nmat <- norm(mat)

> apply(nmat, 2, range)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    0    0    0    0    0    0    0    0    0     0
[2,]    1    1    1    1    1    1    1    1    1     1

另一个简单的替代方法是使用现有的scale()函数,并为参数centerscale提供所需的值,而不是使用默认值(这将标准化数据):

代码语言:javascript
运行
复制
mins <- apply(mat, 2, min)
maxs <- apply(mat, 2, max)
nmat2 <- scale(mat, center = mins, scale = maxs - mins)

> apply(nmat2, 2, range)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    0    0    0    0    0    0    0    0    0     0
[2,]    1    1    1    1    1    1    1    1    1     1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25189609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档