我有一个新手问题:
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循环。
答案 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)
我们可以使用row
和col
函数进行复制
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