提问人:Marius 提问时间:11/17/2013 更新时间:11/17/2013 访问量:174
用相应的行和填充矩阵的所有单元格
Fill all cells of a matrix with the corresponding row sum
问:
我试图为一个看似相当简单的任务找到一个矢量化解决方案:用相应行的行和填充矩阵的所有单元格,例如:
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
为了增加一些现实世界的背景,我正在尝试为我正在上统计学课的手法计算独立性卡方检验的各个步骤。
答:
2赞
Jilber Urbina
11/17/2013
#1
这是一个选项:
> output[,] <- mm_rowsums # this part does the same as your `for` loop
> output
[,1] [,2] [,3]
[1,] 105 105 105
[2,] 95 95 95
评论
0赞
Marius
11/17/2013
只是为了确认我的理解,这是矢量回收,与先填充列下层的矩阵的默认方式配对?
1赞
A5C1D2H2I1M1N2O1R2T1
11/17/2013
#2
也许你可以使用: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))
评论
0赞
Marius
11/17/2013
谢谢,我实际上希望对列做同样的事情,看起来我可以同时使用两者。replicate
1赞
user1317221_G
11/17/2013
#3
显然我不会这样做,但因为你似乎正在为一种使用方式而苦苦挣扎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
评论