Comment ajouter des lignes à des cadres de données vides avec en-tête dans R? [dupliquer]

possibilité de dupliquer:

R: perte de noms de colonnes lors de l'ajout de lignes à une base de données vide

j'ai créé une base de données vide avec les noms de colonne seulement 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

dans la colonne ci-dessus après avoir ajouté une ligne, les noms des colonnes sont changés. Comment puis-je ajouter de nouvelles données de ligne de données-cadre?

31
demandé sur Community 2012-09-27 09:02:42

6 réponses

ajouter à une ligne zéro data.frame agira différemment d'ajouter à une data.frame qui contient déjà des lignes

de ?rbind

la méthode de base de données rbind supprime d'abord tous les arguments à colonne zéro et à rangée zéro. (Si cela ne laisse AUCUN, il renvoie le premier argument avec des colonnes autrement une base de données zéro colonne zéro rangée.) Il prend ensuite les classes des colonnes à partir de la première base de données, et correspond colonnes par nom (plutôt que par position). Les facteurs ont leurs niveaux augmentés au besoin (dans l'ordre des niveaux des ensembles de 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 anciennes (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 forcer c(5,433) à une liste ou de données.cadre

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, autant faire

do.call(data.frame,setNames(as.list(c(5,443)), names(compData)))
"1519210920 des données".option de la table

vous pouvez utiliser la data.table fonction rbindlist qui fait moins de vérification et préserve ainsi les noms de les premières données.cadre

library(data.table)
rbindlist(list(compData, as.list(c(5,443))
25
répondu mnel 2012-09-27 11:48:35

je viens d'avoir 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
12
répondu Surjya Narayana Padhi 2012-09-27 05:55:35
Colnames <- names(compData)
compData <- rbind(compData, c(5, 443))
names(compData) <- Colnames
4
répondu Maiasaura 2012-09-27 05:33:29

vous pouvez affecter au dataframe 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
2
répondu Marius 2012-09-27 05:22:50

vous pouvez utiliser la fonction structure avec l'argument .Names :

compData <- structure(rbind(compData,c(5,443)), .Names = names(compData))

#  A   B
#1 5 443
2
répondu Sven Hohenstein 2012-09-27 13:13:12

si vous avez des données du même type*, vous pouvez faire ce qui suit:

  1. convertissez la base de données actuelle en une matrice.

    as.matrix(compData)
  2. Ajouter une nouvelle ligne à la fin.

    rbind(as.matrix(compData), c(5,443))
  3. convertissez la matrice en base 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 de même type, vous pouvez les conserver dans une matrice.

2
répondu srctaha 2015-05-19 01:14:00