将列均值和行均值添加到r中的矩阵

时间:2016-05-28 02:07:16

标签: r for-loop matrix

我有一个新手问题:

  Example of a dataset: 
  dat = matrix(1:6,3,2) #create a dataset
 #     [,1] [,2]
#[1,]    1    4
#[2,]    2    5
#[3,]    3    6

  rmean = rowMeans(dat)  # calculate the row means of dat
 #[1] 2.5 3.5 4.5
  cmean = colMeans(dat)  # calculate the colum means of dat
 #[1] 2 5

我想要一个矩阵如下:

      [,1] [,2]
[1,]   5.5  11.5
[2,]   7.5  13.5
[3,]   9.5  15.5

第一行计算如下:< / p>

  1+rowmeans(2.5) + colmeans(2) = 5.5
  4+rowmeans(2.5) + colmeans(5) = 11.5

这就是我的尝试:

  newdat = matrix(NA, 3,2)
  for (row in 1:nrow(dat))
    for (col in 1:ncol(dat)) {
    rmean = rowMeans(dat)
    cmean = colMeans(dat)
    newdat[row,col] = dat[row,] + rmean[row] + cmean[col]
  }

我们将不胜感激任何帮助,请更正我的for循环。

4 个答案:

答案 0 :(得分:3)

这可以简单地利用+逐个元素对矩阵进行操作这一事实,而无需使用for循环或sweep。依靠循环利用柱和行方式填充基质。

dat + matrix(rowMeans(dat),3,2) + matrix(colMeans(dat),3,2, byrow = T) 
##     [,1] [,2]
##[1,]  5.5 11.5
##[2,]  7.5 13.5
##[3,]  9.5 15.5

答案 1 :(得分:2)

R中有很多用于处理矩阵的函数;它通常只是找到你想要的那个。在这种情况下,sweep就是您想要的:

sweep(sweep(dat, 1, rowMeans(dat), `+`), 2, colMeans(dat), `+`)
#      [,1] [,2]
# [1,]  5.5 11.5
# [2,]  7.5 13.5
# [3,]  9.5 15.5
  • 第二个参数是边距,如apply,其中1是行,2是列;
  • 第三个是在行/列上操作的向量;和
  • 第四个是对他们进行的操作。您需要+周围的反引号才能将其作为名称传递。

弄清楚如何安排这些功能可能很痛苦,但一旦你这样做,它们就非常有用。可悲的是,一些较复杂的帮助页面很难理解,但here's some useful reading解释得更好。

或者,您可以获得一些创意并利用矢量回收:

t(t(dat + rowMeans(dat)) + colMeans(dat))
#      [,1] [,2]
# [1,]  5.5 11.5
# [2,]  7.5 13.5
# [3,]  9.5 15.5

答案 2 :(得分:2)

无需循环。 R的优点是使用Matrix / Vector操作来完成您要实现的目标。

dat = matrix(1:6,3,2) #create a dataset

rmean = rowMeans(dat)
cmean = colMeans(dat)

newdat = dat + rmean 

newdat = t(apply(newdat, 1, function(x) x + cmean))

答案 3 :(得分:2)

我们可以使用rowcol函数进行复制

dat+rowMeans(dat)[row(dat)] + colMeans(dat)[col(dat)]
#     [,1] [,2]
#[1,]  5.5 11.5
#[2,]  7.5 13.5
#[3,]  9.5 15.5
相关问题