我创建了两个矩阵如下:
A = c(1,2,3)
B = c(2,4,6)
c = as.matrix(c(3,6,9))
z = as.matrix(cbind(A, B))
现在我想取矩阵c并逐行减去它,例如1-3 = -2& 2-3 = -1 要好好理解R编程,我想创建一个for循环。请你所有的答案都应该改善我的循环。
for (i in 1:nrow(z))# for the rows in matrix z
for (j in 1:nrow(c)) # for the rows in matrix c
{
sub = matrix(NA, 3,2) # make a placeholder
sub [i,]= z[i,]-c[j,] # i am not sure whether this right
return((sub))
}
我收到以下错误:
Error: no function to return from, jumping to top level
我相信我的for循环是错误的,任何人都可以提供帮助。目的是了解有关R编程的更多信息。感谢
答案 0 :(得分:7)
这是sweep
的好例子:
sweep(z, 1, c)
# A B
#[1,] -2 -1
#[2,] -4 -2
#[3,] -6 -3
答案 1 :(得分:3)
如果以这种方式编写循环:
attendance_id
它会毫无错误地结束,但你会得到:
sub = matrix(NA, 3,2) # make a placeholder
for (i in 1:nrow(z))# for the rows in matrix z
for (j in 1:nrow(c)) # for the rows in matrix c
{
sub [i,]= z[i,]-c[j,] # i am not sure whether this right
}
sub
这不是您所期望的...因为最后一个j总是3,所以您将 [,1] [,2]
[1,] -8 -7
[2,] -7 -5
[3,] -6 -3
替换为sub[i,]
z[i,]-c[3,]
现在,如果你用以下代码替换循环:
z[i,]-9
然后你会:
for (i in 1:nrow(z)) #(nrow(z)==nrow(c))
{
sub [i,]= z[i,]-c[i,]
}
答案 2 :(得分:2)
虽然不推荐,但这将有效
sub = matrix(NA, 3,2)
for (i in 1:nrow(z)) {
sub[i,]=z[i,]-c[i,1]
}
你不需要第二个循环,c也是一个列矩阵。
答案 3 :(得分:2)
你也可以创建一个矩阵,其中两列都由c
:
z - cbind(c, c)
## A B
## [1,] -2 -1
## [2,] -4 -2
## [3,] -6 -3
对于具有多列的矩阵,这不是一个方便的解决方案。您可以将cbind
与do.call
一起使用,以获得更大的灵活性:
z - do.call(cbind, rep(list(c), 2))
有必要将c
放入列表中。否则,rep(...)
将返回单个向量而不是列矩阵列表:
rep(c, 2)
## [1] 3 6 9 3 6 9
rep(list(c), 2)
## [[1]]
## [,1]
## [1,] 3
## [2,] 6
## [3,] 9
##
## [[2]]
## [,1]
## [1,] 3
## [2,] 6
## [3,] 9