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"
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é.
dat = data.frame(col1=numeric(), col2=numeric())
...loop
dat[, dim(dat)[1] + 1] = c(324, 234)
Cela conserve les noms de colonne
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.