我想在循环中创建不同的矩阵,然后将它们组合(cbind或rbind)。但以下代码不起作用。为什么不?以及如何解决它?
dependent = matrix(c(30,184,6,106), 2, 2, byrow=T)
independent = c(160,166)
expected = numeric()
{for(i in 1:length(independent))
a = dependent*independent[i]/sum(independent)
expected = cbind(expected,a)}
这给出了:
expected
[,1] [,2]
[1,] 15.276074 93.69325
[2,] 3.055215 53.97546
这是仅使用for循环的最后一次迭代的结果。所以结果就像只使用了166,但160不是。
答案 0 :(得分:3)
一些评论:
您的for
循环括号位置错误。你有:
R> {for(i in 1:3)
+ cat(i, "\n")
+ cat(i, "\n")
+ }
1
2
3
3
相反,你应该:
R> for(i in 1:3) {
+ cat(i, "\n")
+ cat(i, "\n")
+ }
1
1
2
2
3
3
构造for
循环并省略括号时,只使用for
语句后的第一行。
您可以通过保存for
的结果来提高sum(independent)
循环的效率,因为每次迭代都不会改变,即
for(i in 1:length(independent)){
a = dependent*independent[i]
expected = cbind(expected,a)
}
expected = expected//sum(independent)
实际上你可以将整个计算进行矢量化
y = sapply(independent, '*', dependent)
matrix(y, ncol=4,nrow=2)/sum(independent)
答案 1 :(得分:3)
你可以完全放弃for循环并使用:
X <- lapply(independent, function(x) (dependent*x)/sum(independent))
do.call("cbind", X)
编辑:由于订单不正确,我编辑了我的回复。