在R中构造动态大小的数组

时间:2010-12-05 07:43:59

标签: r

我想知道在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,:"  

谢谢和问候!

6 个答案:

答案 0 :(得分:6)

我认为你要找的答案是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行和第0行产生单个值。

 require(Matrix)
 M <- sparseMatrix(i=200, j=50, x=234)
 M[1,1]
#   [1] 0
 M[200, 50]
#   [1] 234

但我认为稀疏矩阵的使用最好保留在掌握常规矩阵后供以后使用。

答案 1 :(得分:4)

在填充之后可以对数组进行尺寸标注(以一维,矢量,方式) 模拟问题的一维片段,这是更高维度的方式。

> 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))用于更通用的方法,如下所示(对于4 x 7数组)例如)

> 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

答案 2 :(得分:2)

你可以反驳它:

tmp = c(1,2) 

x = NULL

rbind(x, tmp)

答案 3 :(得分:2)

我相信这是您需要的方法

arr <- array(1)

arr <- append(arr,3)

arr[1] <- 2

print(arr[1])

(在rosettacode.org上找到)

答案 4 :(得分:1)

当我想动态构造一个数组(矩阵)时,我这样做:

n <- 500
new.mtrx <- matrix(ncol = 2, nrow = n)

head(new.mtrx)
     [,1] [,2]
[1,]   NA   NA
[2,]   NA   NA
[3,]   NA   NA
[4,]   NA   NA
[5,]   NA   NA
[6,]   NA   NA

您的矩阵现在已准备好接受矢量。

假设您已有一个向量,则将其传递给matrix()函数。注意如何将值“分解”到矩阵中(按列方式)。这可以使用byrow参数进行更改。

    matrix(letters, ncol = 2)
      [,1] [,2]
 [1,] "a"  "n" 
 [2,] "b"  "o" 
 [3,] "c"  "p" 
 [4,] "d"  "q" 
 [5,] "e"  "r" 
 [6,] "f"  "s" 
 [7,] "g"  "t" 
 [8,] "h"  "u" 
 [9,] "i"  "v" 
[10,] "j"  "w" 
[11,] "k"  "x" 
[12,] "l"  "y" 
[13,] "m"  "z" 

答案 5 :(得分:0)

n = 5
x = c(1,2) %o% rep(1,n)
x
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    1    1    1    1    1
# [2,]    2    2    2    2    2

x = rep(1,n) %o% c(1,2)
x
#      [,1] [,2]
# [1,]    1    2
# [2,]    1    2
# [3,]    1    2
# [4,]    1    2
# [5,]    1    2