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

将列平均值和行平均值添加到r中的矩阵,r,for-loop,matrix,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) # calc

我有一个新手问题:

  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
  1+rowmeans(2.5) + colmeans(2) = 5.5
  4+rowmeans(2.5) + colmeans(5) = 11.5
第一行计算如下:

      [,1] [,2]
[1,]   5.5  11.5
[2,]   7.5  13.5
[3,]   9.5  15.5
  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循环

在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是列
  • 第三个是跨行/列操作的向量;及
  • 第四个是对他们所做的操作。您需要在
    +
    周围加上反勾号才能将其作为名称传递
弄清楚如何安排函数可能是一件痛苦的事情,但一旦弄清楚了,它们就非常有用了。遗憾的是,一些更复杂的帮助页面很难理解,但这解释得更好一些


或者,您可以获得一些创造性,并利用向量循环:

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

不需要循环。R的优点是使用矩阵/向量运算来实现您想要实现的目标

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))

这可以简单地利用
+
逐元素对矩阵进行操作的事实来实现,而无需对
循环或
扫描使用
。依靠循环使用列和行的平均值填充矩阵

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

我们可以使用
功能进行复制

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

我在这里看不到减法,尽管标题经受住了另一个相当愚蠢的选项:
dat+ave(dat,col(dat))+ave(dat,row(dat))
对于“滥用回收”的方式,我会做
dat+rowMeans(dat)+colMeans(dat)[col col col dat]
@alistaire谢谢,但如果我必须使用循环(我知道在R中不建议这样做),我该如何改进我的For循环?我做错了什么,你能修好吗。这纯粹是我自己的理解。谢谢首先,除非绝对必要,否则不要使用循环。也就是说,您缺少了一些大括号,需要在分配时通过
row
col
dat
进行子集划分。此外,还应该计算循环外的行和列的平均值,这样就不会重复计算相同的内容。总而言之:
rmean谢谢,但是如果我必须使用循环(我知道在R中不建议这样做),我将如何改进for循环?我做错事了。