我正在尝试为一个看似相当简单的任务找到一个矢量化解决方案:用相应行的行和填充矩阵的所有单元格,例如:
mymat = matrix(c(80, 15, 10, 60, 30, 5), nrow=2, byrow=TRUE)
mm_rowsums = rowSums(mymat)
output = matrix(nrow=nrow(mymat), ncol=ncol(mymat))
for (row_num in 1:nrow(mymat)) {
output[row_num, ] = mm_rowsums[row_num]
}
期望的结果:
> output
[,1] [,2] [,3]
[1,] 105 105 105
[2,] 95 95 95
我对各种apply
函数的了解虽然让我失望,但我无法看到如何以矢量化的方式按行填充。
为了增加一些现实世界的背景,我正在尝试计算我正在进行的统计课程的卡方式独立测试的各个步骤。
答案 0 :(得分:2)
这是一个选项:
> output[,] <- mm_rowsums # this part does the same as your `for` loop
> output
[,1] [,2] [,3]
[1,] 105 105 105
[2,] 95 95 95
答案 1 :(得分:1)
也许你可以使用replicate
:
replicate(ncol(mymat), mm_rowsums)
# [,1] [,2] [,3]
# [1,] 105 105 105
# [2,] 95 95 95
## Or, without creating "mm_rowsums"
replicate(ncol(mymat), rowSums(mymat))
答案 2 :(得分:1)
显然我不会这样做,但是因为你似乎在努力使用apply
的方法
“我对各种应用函数的了解虽然让我失望,但我无法看到如何以矢量化方式按行填充”
我认为这对你有用:
t(apply(mymat, 1, function(x){ ifelse(x != sum(x), sum(x), x) } ))
# [,1] [,2] [,3]
#[1,] 105 105 105
#[2,] 95 95 95