2010-12-05 55 views
4

我想知道什么是构建在R.构造中的R动态大小的数组

动态大小的数组对于一个示例的方式,我要构建一个正向量,但其维数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,:" 

感谢和问候!

回答

4

是可能的维度数组之后我们填充它(以一维,向量,时尚)
模拟1维sni问题的关键,可以通过更高维度来完成。

> 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×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

可以rbind它:

tmp = c(1,2) 

x = NULL 

rbind(x, tmp) 
2

我相信这是一个方法,你需要

arr <- array(1) 

arr <- append(arr,3) 

arr[1] <- 2 

print(arr[1]) 

(上rosettacode.org找到)

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" 
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 

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

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