我想知道在R中构造动态大小数组的方法是什么。
举个例子,我想构造一个n向量,但它的维度n是动态确定的。以下代码将起作用:
> x=NULL
> n=2;
> for (i in 1:n) x[i]=i;
> x
[1] 1 2
再举一个例子,我想构造一个n乘2的矩阵,其中n的行数是动态确定的。但我甚至在分配第一行时都失败了:
> tmp=c(1,2)
> x=NULL
> x[1,]=tmp
Error in x[1, ] = tmp : incorrect number of subscripts on matrix
> x[1,:]=tmp
Error: unexpected ':' in "x[1,:"
感谢和问候!
发布于 2010-12-05 08:28:30
可以在填充数组后对其进行尺寸标注(以一维、向量的方式)
仿效这个问题的一维片段,这里是用更高的维度完成它的方法。
> x=c()
> tmp=c(1,2)
> n=6
> for (i in seq(1, by=2, length=n)) x[i:(i+1)] =tmp;
> dim(x) = c(2,n)
> x
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 1 1 1 1 1
[2,] 2 2 2 2 2 2
>
与使用i:(i+1)
作为索引相比,使用seq(i, length=2)
或更好的seq(i, length=length(tmp))
作为更通用的方法可能更好,如下所示(对于4x7数组示例)
> x=c()
> tmp=c(1,2,3,4)
> n=7
> for (i in seq(1, by=length(tmp), length=n))
x[seq(i, length=length(tmp))] = tmp;
> dim(x) = c(length(tmp),n)
> x
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 1 1 1 1 1 1 1
[2,] 2 2 2 2 2 2 2
[3,] 3 3 3 3 3 3 3
[4,] 4 4 4 4 4 4 4
>
我们也可以通过使用cbind/rbind重新赋值x来获得类似的结果,如下所示。
> tmp=c(1,2)
> n=6
> x=rbind(tmp)
> for (i in 1:n) x=rbind(x, tmp);
> x
[,1] [,2]
tmp 1 2
tmp 1 2
tmp 1 2
tmp 1 2
tmp 1 2
tmp 1 2
tmp 1 2
注意:可以去掉"tmp“名称(这些是rbind的副作用),使用
> dimnames(x)=NULL
发布于 2010-12-05 17:25:24
我认为您正在寻找的答案是rbind()和cbind():
> x=NULL # could also use x <- c()
> rbind(x, c(1,2))
[,1] [,2]
[1,] 1 2
> x <- rbind(x, c(1,2))
> x <- rbind(x, c(1,2)) # now extend row-wise
> x
[,1] [,2]
[1,] 1 2
[2,] 1 2
> x <- cbind(x, c(1,2)) # or column-wise
> x
[,1] [,2] [,3]
[1,] 1 2 1
[2,] 1 2 2
尝试像您尝试的那样动态分配“新索引”的策略可以在某些语言中完成,但在R中不能这样做。
您还可以使用Matrix包中提供的稀疏矩阵。它们将允许M <- sparseMatrix(i=200, j=50, x=234)
形式的赋值,导致在第200行、第50列和其他所有位置都有一个值。
require(Matrix)
M <- sparseMatrix(i=200, j=50, x=234)
M[1,1]
# [1] 0
M[200, 50]
# [1] 234
但我认为稀疏矩阵的使用最好留待掌握了正则矩阵之后再使用。
发布于 2010-12-05 08:14:24
您可以重新绑定它:
tmp = c(1,2)
x = NULL
rbind(x, tmp)
https://stackoverflow.com/questions/4357866
复制