2010-12-05 8 views
4

Je me demandais quelles sont les façons de construire tableau de taille dynamique R.Construire ensemble la taille dynamique R

Pour un exemple, je veux construire un n-vecteur, mais sa dimension n est déterminé de manière dynamique . Le code suivant fonctionnera:

> x=NULL 
> n=2; 
> for (i in 1:n) x[i]=i; 
> x 
[1] 1 2 

Pour un autre exemple, je veux construire un n par 2 matrice où le nombre de lignes n est déterminé de manière dynamique. Mais j'échoue même à assigner la première rangée:

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

Merci et salutations!

Répondre

4

Il est possible de dimensionner le tableau après nous le remplissons (dans un unidimensionnel, le vecteur, la mode)
Émuler le sni 1-dimension ppet de la question, voici comment cela peut être fait avec des dimensions plus élevées.

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

Plutôt que d'utiliser i:(i+1) comme indice, il peut être préférable d'utiliser seq(i, length=2) ou mieux encore, seq(i, length=length(tmp)) une approche plus générique, comme illustré ci-dessous (pour un exemple de tableau 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 
> 

Nous pouvons également obtenir un résultat similaire en ré-affectant x avec cbind/rbind, comme suit.

> 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 

Note: on peut se débarrasser des noms « tmp » (ceux-ci sont un effet secondaire de la rbind), avec
> dimnames(x)=NULL

2

Vous pouvez rbind il:

tmp = c(1,2) 

x = NULL 

rbind(x, tmp) 
2

Je crois que c'est une approche dont vous avez besoin

arr <- array(1) 

arr <- append(arr,3) 

arr[1] <- 2 

print(arr[1]) 

(trouve sur rosettacode.org)

1

Quand je veux construire dynamiquement un tableau (matrice), Je le fais comme ça:

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 

Votre matrice est maintenant prête à accepter les vecteurs.

En supposant que vous avez déjà un vecteur, transmettez-le à la fonction matrix(). Remarquez comment les valeurs sont "cassées" dans la matrice (colonne sage). Cela peut être modifié avec l'argument 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

Je pense que les réponses que vous recherchez sont rbind() et 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 

La stratégie d'essayer d'attribuer aux « nouveaux indices » à la volée que vous tentiez peut être fait dans certaines langues mais ne peut pas être fait de cette façon dans R.

Vous pouvez également utiliser des matrices creuses fournies dans le paquet Matrix.Ils permettraient des affectations du formulaire M <- sparseMatrix(i=200, j=50, x=234) résultant en une seule valeur à la ligne 200, colonne 50 et 0 partout ailleurs.

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

Mais je pense que l'utilisation de matrices creuses est mieux réservée pour une utilisation ultérieure après la maîtrise des matrices régulières.

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 
Questions connexes