Duplicata possible:
R: perte des noms de colonne lors de l'ajout de lignes à un bloc de données vide
J'ai créé une trame de données vide avec les noms de colonne uniquement comme suit
> compData <- data.frame(A= numeric(0), B= numeric(0))
> compData
[1] A B
<0 rows> (or 0-length row.names)
> compData <- rbind(compData,c(5,443))
> compData
X5 X443
1 5 443
ci-dessus après avoir ajouté une ligne, les noms des colonnes sont modifiés. Comment puis-je ajouter de nouvelles données de ligne à la trame de données?
L'ajout à une ligne zéro data.frame
Agira différemment de l'ajout à un data.frame
Qui contient déjà des lignes
De ?rbind
La méthode de trame de données rbind supprime d'abord tous les arguments de colonne zéro et de ligne zéro. (Si cela n'en laisse aucun, il renvoie le premier argument avec des colonnes, sinon un bloc de données à zéro colonne à zéro.) Il prend ensuite les classes des colonnes du premier bloc de données et fait correspondre les colonnes par nom (plutôt que par position) . Les facteurs ont leurs niveaux augmentés si nécessaire (dans l'ordre des niveaux des niveaux des facteurs rencontrés) et le résultat est un facteur ordonné si et seulement si tous les composants étaient des facteurs ordonnés. (Le dernier point diffère de S-PLUS.) Les catégories à l'ancienne (vecteurs entiers avec niveaux) sont promues en facteurs.
Vous avez un certain nombre d'options -
compData[1, ] <- c(5, 443)
Ou vous pouvez contraindre c(5,433)
à une liste ou data.frame
rbind(compData,setNames(as.list(c(5,443)), names(compData)))
ou
rbind(compData,do.call(data.frame,setNames(as.list(c(5,443)), names(compData))))
Mais dans ce cas, vous feriez aussi bien
do.call(data.frame,setNames(as.list(c(5,443)), names(compData)))
Vous pouvez utiliser la fonction data.table
rbindlist
qui vérifie moins et conserve ainsi les noms du premier data.frame
library(data.table)
rbindlist(list(compData, as.list(c(5,443))
J'ai juste un moyen plus simple de le faire ... comme suit
compData <- data.frame(A= numeric(0), B= numeric(0))
compData
compData[nrow(compData)+1, ] <- c(5, 443)
compData
Colnames <- names(compData)
compData <- rbind(compData, c(5, 443))
names(compData) <- Colnames
Vous pouvez affecter à la trame de données par index:
compData <- data.frame(A= numeric(0), B= numeric(0))
compData
compData[1, ] <- c(5, 443)
compData
Qui donne:
> compData <- data.frame(A= numeric(0), B= numeric(0))
> compData
[1] A B
<0 rows> (or 0-length row.names)
> compData[1, ] <- c(5, 443)
> compData
A B
1 5 443
Si vous avez des données du même type *, vous pouvez effectuer les opérations suivantes:
as.matrix(compData)
rbind(as.matrix(compData), c(5,443))
as.data.frame(rbind(as.matrix(compData), c(5,443)))
En bref:compData <- as.data.frame(rbind(as.matrix(compData), c(5,443)))
* Si vous avez des données du même type, vous voudrez peut-être les conserver dans une matrice.
Vous pouvez utiliser la fonction structure
avec le .Names
argument:
compData <- structure(rbind(compData,c(5,443)), .Names = names(compData))
# A B
#1 5 443