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.3
、b.4
、b.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"
所以你不能像在其他语言中那样用 .
添加到一个对象。
我是 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.3
、b.4
、b.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"
所以你不能像在其他语言中那样用 .
添加到一个对象。