dataframe names

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Gabriel Terraz
Messages : 594
Enregistré le : 26 Sep 2011, 15:11

dataframe names

Messagepar Gabriel Terraz » 10 Mar 2025, 19:57

Bonjour,
En debugant mon code, j'ai remarqué un comportement étrange (en tout cas à première vue) lorsqu'on assigne un nouvel élément dans un dataframe sans nom.
Si on utilise '$', les précédentes colonnes auront un 'character' vide comme nom, alors que si on utilise '[[', seule la première colonnes aura un nom vide, les autres seront renommées ".1", ".2", etc.
J'obtiens la même chose avec une simple liste.
Avez vous une idée du pourquoi ?
Je précise que ce n'est pas bloquant, c'est par curiosité !

Voici l'exemple :

Code : Tout sélectionner

# data bidon
d <- data.frame(1:3, 2:4, 3:5)
# on supprime les noms
> names(d) <- NULL
# on vérifie
> names(d)
NULL
# Un nouvel élément
> d$e <- 9
# nouveaux noms
> names(d)
[1] ""  ""  ""  "e"


Deuxième cas

Code : Tout sélectionner

> d <- data.frame(1:3, 2:4, 3:5)
> names(d) <- NULL
> names(d)
NULL
> d[["e"]] <- 9
> names(d)
[1] ""   ".1" ".2" "e"


Merci!

jean lobry
Messages : 746
Enregistré le : 17 Jan 2008, 20:00
Contact :

Re: dataframe names

Messagepar jean lobry » 11 Mar 2025, 19:02

Jolie question reproductible !

Je n'ai pas le temps de creuser là, mais j'ai l'impression que cela à voir avec le test de l'unicité des noms d'une liste qui sera honoré différemment selon le constructeur utilisé.

Je suis aussi intéressé par la réponse à cette énigme !

Bien amicalement,

jean

Logez Maxime
Messages : 3154
Enregistré le : 26 Sep 2006, 11:35

Re: dataframe names

Messagepar Logez Maxime » 11 Mar 2025, 20:00

Bonjour,

Si je ne dis pas de bêtise, ça vient des fonctions qui sont utilisées pour la création de ta colonne.
avec le "$", tu fais appel à "$<-.data.frame" qui ne fait rien de particulier sur les noms des colonnes (match.fun("$<-.data.frame")). Du coup comme tu associes le caractère "e" à des NULL tu crées un vecteur de chaînes de caractères et les NULL se transforment en "".
Avec les "[[" tu fais appel à la fonction "[[<-.data.frame" qui à un moment utilise la commande suivante : names(x) <- make.unique(names(x)).
A mon avis ça reprend la logique précédente, tu as un vecteur de noms de colonne qui est c("", "", "", "e"), puisque tu as ajouté un "e" au reste. Une fois passé dans la fonction make.unique, le premier "" reste intact, mais le suivant devient ".1" pour se distinguer du premier "", et ainsi de suite.

Bien cordialement,
Maxime

jean lobry
Messages : 746
Enregistré le : 17 Jan 2008, 20:00
Contact :

Re: dataframe names

Messagepar jean lobry » 22 Mar 2025, 16:45

Fiat lux ! Merci Maxime


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité