web-dev-qa-db-fra.com

Comment ajouter des lignes à des trames de données vides avec en-tête dans R?

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?

35

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 -

le plus simple

 compData[1, ] <- c(5, 443)

plus compliqué

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

option data.table

Vous pouvez utiliser la fonction data.tablerbindlist qui vérifie moins et conserve ainsi les noms du premier data.frame

library(data.table)
rbindlist(list(compData, as.list(c(5,443))
28
mnel

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
17
Colnames <- names(compData)
compData <- rbind(compData, c(5, 443))
names(compData) <- Colnames
5
Maiasaura

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

Si vous avez des données du même type *, vous pouvez effectuer les opérations suivantes:

  1. Convertissez le bloc de données réel en une matrice.
    as.matrix(compData)
  2. Ajoutez la nouvelle ligne à la fin.
    rbind(as.matrix(compData), c(5,443))
  3. Convertissez la matrice en une trame de données.
    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.

2
srctaha

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
2
Sven Hohenstein