Double Loop with R(向量乘法和 n 个向量创建)

Double Loop with R (vector multiplication and n vector creation)

我是 R 的新用户,我正在尝试基于循环将 2 个向量的元素相乘,并从中创建该数据集的 n 个新向量

 A = matrix(data= c(1, 2,3, 4, 5, 6, 7, 8, 9), nrow= 3, ncol= 3)
B = matrix(data= c(6, 1, 3), nrow= 1, ncol = 3)
C = matrix(data= c(5, 2, 2), nrow = 3, ncol= 1)

b.1 = matrix(data= NA, nrow = 1, ncol =ncol(A))
  for (i in 1:ncol(B))
  b.1[1, i] =((A[,i]%*%C[,ncol(C)]/A[nrow(A),i] ))

c.1 <- matrix(data = NA , nrow  = nrow(C) , 1)
  for (j in 1: nrow(C))  
  c.1[j, 1] = (A[j,]%*%B[nrow(B),]/A[j,ncol(A)])  
  
b.2 <-matrix(data=NA, nrow= 1, ncol= ncol(A))
  for (i in 1:ncol(A))
  b.2[1, i] = ((A[,i]%*%c.1[,ncol(c.1)]/A[nrow(A),i] ))
    
c.2 <- matrix(data= NA, nrow = nrow(C), ncol= 1)
  for (j in 1: nrow(C))
  c.2[j,1] = (A[j,]%*%b.1[nrow(b.1),]/A[j,ncol(A)])

直到这一部分,代码都可以工作,但是我不能使用这个双循环,有人知道为什么吗? 提前致谢

##c.x y b.x
for x in 3:10{
  b.[x] <-matrix(data=NA, nrow= 1, ncol= ncol(A))
  for (i in 1:ncol(A))
   b.[x][1, i] = ((A[,i]%*%c.[x-1][,ncol(c.1)]/A[nrow(A),i] ))
c.[x] <- matrix(data= NA, nrow = nrow(C), ncol= 1)
  for (j in 1: nrow(C))
    c.[x][j,1] = (A[j,]%*%b.[x-1][nrow(b.[x-1]),]/A[j,ncol(A)])

您的具体问题有点复杂,所以我将进行简化,以便您了解哪些问题不起作用,以及如何让您的特定代码正常工作。

##c.x y b.x
for(x in 3:10){
  b.[x] <-matrix(data=NA, nrow= 1, ncol= ncol(A))
}
# Error: object 'b.' not found

为什么找不到b.?你没有指定它。在 R 中 b.1 和 b.2 不是同一对象的子集,它们是完全独立的对象。

要在循环中为新对象指定名称,您可以使用类似这样的方法:

for(x in 3:10){
  assign(paste0("b.",x), matrix(data=NA, nrow= 1, ncol= ncol(A)) )
}

现在我们已经创建了名为 b.3b.4b.5、...、b.10 的对象,但您仍然无法简单地在循环中调用 b.[x],因为它似乎是一个名为 b. 的对象和该对象中的第 xth 个元素,这不是您想要做的。

您必须 get() 对象(现在对象是用最后一步创建的):

for(x in 3:10){
  temp<-get(paste0("b.",x))
  print(temp)
}

     [,1] [,2] [,3]
[1,]   NA   NA   NA
     [,1] [,2] [,3]
[1,]   NA   NA   NA
     [,1] [,2] [,3]
[1,]   NA   NA   NA
     [,1] [,2] [,3]
[1,]   NA   NA   NA
     [,1] [,2] [,3]
[1,]   NA   NA   NA
     [,1] [,2] [,3]
[1,]   NA   NA   NA
     [,1] [,2] [,3]
[1,]   NA   NA   NA
     [,1] [,2] [,3]
[1,]   NA   NA   NA

一个愚蠢的例子,添加到列,然后在嵌套的 for 循环中迭代添加数据帧:

for(x in 3:10){
  assign(paste0("b.",x), matrix(data=NA, nrow= 1, ncol= ncol(A)) )
  temp<-get(paste0("b.",x))
  for(i in 1:ncol(A)){
     temp[1, i]<-paste("whatever you want +",i)
  }
  assign(paste0("b.",x),temp)
} 

现在让我们看看其中一个数据帧 b.4(尽管此代码每个都相同):

b.4
     [,1]                    [,2]                      [,3] 
[1,] "whatever you want + 1" "whatever you want + 2"   "whatever you want + 3"

所以你不能像在其他语言中那样用 . 添加到一个对象。