2010-12-05 51 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