用相应的行和填充矩阵的所有单元格

Fill all cells of a matrix with the corresponding row sum

提问人:Marius 提问时间:11/17/2013 更新时间:11/17/2013 访问量:174

问:

我试图为一个看似相当简单的任务找到一个矢量化解决方案:用相应行的行和填充矩阵的所有单元格,例如:

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

为了增加一些现实世界的背景,我正在尝试为我正在上统计学课的手法计算独立性卡方检验的各个步骤。

r

评论


答:

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