web-dev-qa-db-fra.com

Comment créer une matrice vide dans R?

Je suis nouveau dans R. Je veux remplir une matrice vide avec les résultats de ma boucle for en utilisant cbind. Ma question est la suivante: comment puis-je éliminer les AN dans la première colonne de ma matrice? J'inclus mon code ci-dessous: 

output<-matrix(,15,) ##generate an empty matrix with 15 rows, the first column already filled with NAs, is there any way to leave the first column empty?

for(`enter code here`){
normF<-`enter code here`
output<-cbind(output,normF)
}

La sortie est la matrice que j'attendais. Le seul problème est que sa première colonne est remplie de NA. Comment puis-je supprimer ces NA?

52
user3276582

La valeur par défaut pour matrix est d’avoir 1 colonne. Pour avoir explicitement 0 colonnes, vous devez écrire

matrix(, nrow = 15, ncol = 0)

Un meilleur moyen serait de préallouer la matrice entière puis de la remplir.

mat <- matrix(, nrow = 15, ncol = n.columns)
for(column in 1:n.columns){
  mat[, column] <- vector
}
76
Christopher Louden

Si vous ne connaissez pas le nombre de colonnes à l'avance, ajoutez chaque colonne à une liste et cbind à la fin.

List <- list()
for(i in 1:n)
{
    normF <- #something
    List[[i]] <- normF
}
Matrix = do.call(cbind, List)
16
Señor O

Je serais prudent car rejeter quelque chose comme une mauvaise idée parce que c'est lent. S'il s'agit d'une partie du code dont l'exécution ne prend pas beaucoup de temps, la lenteur n'a pas d'importance. Je viens d'utiliser le code suivant:

for (ic in 1:(dim(centroid)[2]))
{
cluster[[ic]]=matrix(,nrow=2,ncol=0)
}
# code to identify cluster=pindex[ip] to which to add the point
if(pdist[ip]>-1)
{
cluster[[pindex[ip]]]=cbind(cluster[[pindex[ip]]],points[,ip])
}

pour un problème qui a fonctionné en moins de 1 seconde.

6
Jonathan Harris

Pour supprimer la première colonne de NA, vous pouvez le faire avec une indexation négative (qui supprime les index du jeu de données R). Par exemple:

output = matrix(1:6, 2, 3) # gives you a 2 x 3 matrix filled with the numbers 1 to 6

# output = 
#           [,1] [,2] [,3]
#     [1,]    1    3    5
#     [2,]    2    4    6

output = output[,-1] # this removes column 1 for all rows

# output = 
#           [,1] [,2]
#     [1,]    3    5
#     [2,]    4    6

Vous pouvez donc simplement ajouter output = output[,-1]after à la boucle for dans votre code d'origine.

0
Sheldon