J'essaie d'initialiser un data.frame sans aucune ligne. Fondamentalement, je veux spécifier les types de données pour chaque colonne et les nommer, mais ne pas avoir de lignes créées en conséquence.
Le mieux que j'ai pu faire jusqu'à présent est quelque chose comme:
df <- data.frame(Date=as.Date("01/01/2000", format="%m/%d/%Y"),
File="", User="", stringsAsFactors=FALSE)
df <- df[-1,]
Ce qui crée un data.frame avec une seule ligne contenant tous les types de données et noms de colonnes que je voulais, mais crée également une ligne inutile qui doit ensuite être supprimée.
Y a-t-il une meilleure manière de faire cela?
data.frame
ont des colonnes tapées, donc oui, si vous voulez initialiser un,data.frame
vous devez décider du type des colonnes ...data.frame
n'est pas vraiment restrictif sur la "primitivité" des types de colonnes (par exemple, vous pouvez ajouter une colonne de dates ou même une colonne contenant une liste d'éléments). En outre, cette question n'est pas une référence absolue, car par exemple si vous ne spécifiez pas le type correct de la colonne, vous ne bloquerez pas l'ajout de lignes supplémentaires ayant une colonne de types différents ... donc, j'ajouterai une note, mais pas un exemple avec tous les types primitifs car il ne couvre pas toutes les possibilités ...data.frame(Doubles=rep(as.double(NA),numberOfRow), Ints=rep(as.integer(NA),numberOfRow))
Si vous avez déjà un bloc de données existant , disons
df
qu'il a les colonnes que vous voulez, alors vous pouvez simplement créer un bloc de données vide en supprimant toutes les lignes:Notez que
df
contient toujours les données, maisempty_df
pas.J'ai trouvé cette question en cherchant comment créer une nouvelle instance avec des lignes vides, donc je pense que cela pourrait être utile pour certaines personnes.
la source
df[NA,]
cela, cela affectera également l'index (ce qui n'est probablement pas ce que vous voulez), j'utiliserais plutôtdf[TRUE,] = NA
; notez cependant que cela écrasera l'original. Vous devrez d'abord copier la trame de donnéescopy_df = data.frame(df)
, puiscopy_df[TRUE,] = NA
empty_df
avecempty_df[0:nrow(df),] <- NA
.Vous pouvez le faire sans spécifier de types de colonnes
la source
Vous pouvez utiliser
read.table
avec une chaîne vide pour l'entréetext
comme suit:Vous pouvez également spécifier le
col.names
comme une chaîne:Merci à Richard Scriven pour l'amélioration
la source
read.table(text = "", ...)
si vous n'avez pas besoin d'ouvrir explicitement une connexion.read.csv
approche fonctionne également avecreadr::read_csv
, comme dansread_csv("Date,File,User\n", col_types = "Dcc")
. De cette façon, vous pouvez créer directement un morceau vide de la structure requise.La façon la plus efficace de le faire est d'utiliser
structure
pour créer une liste qui a la classe"data.frame"
:Pour mettre cela en perspective par rapport à la réponse actuellement acceptée, voici une référence simple:
la source
data.table
Il contient généralement un.internal.selfref
attribut, qui ne peut pas être simulé sans appeler lesdata.table
fonctions. Êtes-vous sûr de ne pas vous fier à un comportement non documenté ici?data.table
et j'ai supposé que Google avait trouvé ce que je voulais et tout ici estdata.table
lié.data.frame()
fournit des vérifications sur la dénomination, les noms de domaine, etc.Déclarez simplement
lorsque vous essayez à
rbind
la première ligne, cela créera les colonnesla source
rbind
cela fonctionnerait bien, sinon ...rbind()
.Si vous recherchez une brièveté:
vous n'avez donc pas besoin de spécifier les noms de colonne séparément. Vous obtenez le type de colonne par défaut logique jusqu'à ce que vous remplissiez le bloc de données.
la source
Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 0, 2
J'ai créé un bloc de données vide en utilisant le code suivant
et essayé de lier certaines lignes pour remplir la même chose comme suit.
mais il a commencé à donner des noms de colonnes incorrects comme suit
La solution à cela consiste à convertir newrow en type df comme suit
donne maintenant un cadre de données correct lorsqu'il est affiché avec les noms de colonne comme suit
la source
Pour créer un bloc de données vide , passez le nombre de lignes et de colonnes nécessaires dans la fonction suivante:
Pour créer un cadre vide tout en spécifiant la classe de chaque colonne , passez simplement un vecteur des types de données souhaités dans la fonction suivante:
Utilisez comme suit:
Qui donne:
Pour confirmer vos choix, exécutez ce qui suit:
la source
Si vous souhaitez créer un data.frame vide avec des noms dynamiques (noms de colonnes dans une variable), cela peut aider:
Vous pouvez également modifier les types si vous en avez besoin. comme:
la source
Si cela ne vous dérange pas de ne pas spécifier explicitement les types de données, vous pouvez le faire de cette façon:
la source
En utilisant,
data.table
nous pouvons spécifier des types de données pour chaque colonne.la source
Si vous souhaitez déclarer un tel
data.frame
nombre de colonnes, il sera probablement difficile de taper toutes les classes de colonnes à la main. Surtout si vous pouvez utiliserrep
, cette approche est simple et rapide (environ 15% plus rapide que l'autre solution généralisable comme celle-ci):Si vos classes de colonnes souhaitées sont dans un vecteur
colClasses
, vous pouvez effectuer les opérations suivantes:lapply
se traduira par une liste de longueur souhaitée, dont chaque élément est simplement un vecteur typé vide commenumeric()
ouinteger()
.setDF
convertit celalist
par référence à adata.frame
.setnames
ajoute les noms souhaités par référence.Comparaison de vitesse:
C'est aussi plus rapide que d'utiliser
structure
d'une manière similaire:la source
Supposons que les noms de vos colonnes soient dynamiques, vous pouvez créer une matrice vide nommée par ligne et la transformer en un bloc de données.
la source
Cette question n'a pas répondu spécifiquement à mes préoccupations (décrites ici ), mais au cas où quelqu'un voudrait le faire avec un nombre de colonnes paramétré et sans contrainte:
En tant qu'États divergents sur la question liée,
la source
Si vous disposez déjà d'une trame de données, vous pouvez extraire les métadonnées (noms et types de colonnes) d'une trame de données (par exemple, si vous contrôlez un BUG qui n'est déclenché qu'avec certaines entrées et a besoin d'une trame de données vide):
Et puis utilisez le
read.table
pour créer le dataframe videla source