web-dev-qa-db-fra.com

Créer un data.frame vide avec des noms de colonne

J'essaie de créer un cadre de données vide avec deux colonnes et un nombre inconnu de lignes. Je voudrais préciser les noms des colonnes. J'ai couru la commande suivante

dat <- data.frame("id"=numeric(),"nobs"=numeric())  

Je peux tester le résultat en exécutant

> str(dat)
'data.frame':   0 obs. of  2 variables:
 $ id  : num 
 $ nobs: num   

Mais plus tard, lorsque j'insère des données dans ce cadre de données en utilisant rbind dans la commande suivante, les noms des colonnes sont également modifiés.

  for (i in id) {
    nobs = nrow(na.omit(read.csv(files_list[i])))
    dat = rbind(dat, c(i,nobs))
  } 

Après la boucle for c'est la valeur de dat

dat
  X3 X243
1  3  243

Et la commande str montre ce qui suit

str(dat)

'data.frame':   1 obs. of  2 variables:
 $ X3  : num 3
 $ X243: num 243

Quelqu'un peut-il dire pourquoi les noms de col sont dans le changement de trame de données

MODIFIER:

Ma solution paresseuse pour résoudre le problème consiste à exécuter les commandes suivantes après la boucle for qui lie les données à mon data.frame

names(dat)[1] = "id"
names(dat)[2] = "nobs"
13
Khurram Majeed

Fait intéressant, la fonction rbind.data.frame supprime toutes les valeurs transmises qui n'ont aucune ligne. Cela se passe essentiellement dans cette ligne

allargs <- allargs[nr > 0L]

donc, passer dans un data.frame sans lignes, c'est vraiment ne pas le faire passer du tout. Un autre bon exemple de la raison pour laquelle essayer de créer un fichier data.frame ligne par ligne est presque toujours une mauvaise idée. Il est préférable de créer des vecteurs, puis de les combiner dans un nom data.fr uniquement lorsque vous avez terminé. 

10
MrFlick
dat = data.frame(col1=numeric(), col2=numeric())  

...loop
    dat[, dim(dat)[1] + 1] = c(324, 234) 

Cela conserve les noms de colonne

1
user3662777

Je voudrais changer la façon dont vous ajoutez les données au bloc de données. Puisque rbind semble supprimer les noms de colonne, il suffit de remplacer l'emplacement indexé. 

dat <- data.frame("id"=numeric(),"nobs"=numeric())  

for (i in id) {
   dat[i,] <- nrow(na.omit(read.csv(files_list[i])))

 } 

Pour votre information, la création d'un cadre de données par défaut convertit toutes les chaînes en facteurs, ce qui n'est pas un problème ici, car tous vos formats de données sont numériques. Mais si vous avez un caractère (), vous pouvez désactiver le paramètre par défaut stringsAsFactors = FALSE pour ajouter des listes de caractères. 

0
patterja