将列平均值和行平均值添加到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
- 第二个参数是边距,如
,其中1是行,2是列李>apply
- 第三个是跨行/列操作的向量;及
- 第四个是对他们所做的操作。您需要在
周围加上反勾号才能将其作为名称传递+
或者,您可以获得一些创造性,并利用向量循环:
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循环?我做错事了。