我已经编写了下面的代码来生成一个矩阵,其中包含对我来说相当复杂的模式。在这种情况下,我通过反复试验确定完成矩阵中有136行。
我可以编写一个函数来预先计算矩阵行的数量,但函数会有点复杂。在此示例中,矩阵中的行数=((4 * 3 + 1)+(3 * 3 + 1)+(2 * 3 + 1)+(1 * 3 + 1))* 4.
在没有硬连接矩阵语句中的行数的情况下,是否有一种简单有效的方法在R中创建矩阵?换句话说,是否有一种简单的方法让R在使用for循环时根据需要简单地向矩阵添加一行?
我提出了一个在每次循环中使用rbind的解决方案,但这看起来有点复杂,我想知道是否有更容易的解决方案。
很抱歉,如果此问题与之前的问题有关,请注意。我无法使用本网站上的搜索功能或今天使用互联网搜索引擎找到类似的问题,尽管我认为我在过去的某处发现过类似的问题。
下面是两组示例代码,一组使用rbind,另一组使用试验和错误预先设置nrow = 136。
感谢您的任何建议。
v1 <- 5
v2 <- 2
v3 <- 2
v4 <- (v1-1)
my.matrix <- matrix(0, nrow=136, ncol=(v1+4) )
i = 1
for(a in 1:v2) {
for(b in 1:v3) {
for(c in 1:v4) {
for(d in (c+1):v1) {
if(d == (c+1)) l.s = 4
else l.s = 3
for(e in 1:l.s) {
my.matrix[i,c] = 1
if(d == (c+1)) my.matrix[i,d] = (e-1)
else my.matrix[i,d] = e
my.matrix[i,(v1+1)] = a
my.matrix[i,(v1+2)] = b
my.matrix[i,(v1+3)] = c
my.matrix[i,(v1+4)] = d
i <- i + 1
}
}
}
}
}
my.matrix2 <- matrix(0, nrow=1, ncol=(v1+4) )
my.matrix3 <- matrix(0, nrow=1, ncol=(v1+4) )
i = 1
for(a in 1:v2) {
for(b in 1:v3) {
for(c in 1:v4) {
for(d in (c+1):v1) {
if(d == (c+1)) l.s = 4
else l.s = 3
for(e in 1:l.s) {
my.matrix2[1,c] = 1
if(d == (c+1)) my.matrix2[1,d] = (e-1)
else my.matrix2[1,d] = e
my.matrix2[1,(v1+1)] = a
my.matrix2[1,(v1+2)] = b
my.matrix2[1,(v1+3)] = c
my.matrix2[1,(v1+4)] = d
i <- i+1
if(i == 2) my.matrix3 <- my.matrix2
else my.matrix3 <- rbind(my.matrix3, my.matrix2)
my.matrix2 <- matrix(0, nrow=1, ncol=(v1+4) )
}
}
}
}
}
all.equal(my.matrix, my.matrix3)
答案 0 :(得分:6)
如果你对矩阵的大小有一些上限, 你可以创建一个矩阵 大到足以容纳所有数据
my.matrix <- matrix(0, nrow=v1*v2*v3*v4*4, ncol=(v1+4) )
并在最后截断它。
my.matrix <- my.matrix[1:(i-1),]
答案 1 :(得分:2)
这是执行它的通用形式。您可以根据您的问题进行调整
matrix <- NULL
for(...){
...
matrix <- rbind(matriz,vector)
}
其中vector包含行元素
答案 2 :(得分:1)
我今天偶然发现了这个解决方案:将matrix
转换为data.frame
。由于for-loop
需要新行,这些行会自动添加到data.frame
。然后,如果需要,您可以在最后将data.frame
转换回matrix
。我不确定这是否与rbind
的迭代使用类似。大型data.frames
可能会变得非常慢。我不知道。
my.data <- matrix(0, ncol = 3, nrow = 2)
my.data <- as.data.frame(my.data)
j <- 1
for(i1 in 0:2) {
for(i2 in 0:2) {
for(i3 in 0:2) {
my.data[j,1] <- i1
my.data[j,2] <- i2
my.data[j,3] <- i3
j <- j + 1
}
}
}
my.data
my.data <- as.matrix(my.data)
dim(my.data)
class(my.data)
编辑:2015年7月27日
您还可以删除第一个matrix
语句,创建一个空data.frame
,然后将data.frame
转换为最后的matrix
:
my.data <- data.frame(NULL,NULL,NULL)
j <- 1
for(i1 in 0:2) {
for(i2 in 0:2) {
for(i3 in 0:2) {
my.data[j,1] <- i1
my.data[j,2] <- i2
my.data[j,3] <- i3
j <- j + 1
}
}
}
my.data
my.data <- as.matrix(my.data)
dim(my.data)
class(my.data)