Fusionner les dataframes contenus dans une liste

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

Fred Santos
Messages : 233
Enregistré le : 11 Avr 2009, 10:00
Contact :

Fusionner les dataframes contenus dans une liste

Messagepar Fred Santos » 24 Mar 2019, 10:43

Bonjour à tous,

Je dispose d'une liste de dataframes, que j'aimerais concaténer (en lignes) en un seul dataframe, en gardant les noms de lignes à l'identique.
Je procède par exemple ainsi :

Code : Tout sélectionner

# Tableau d'origine :
data(iris)
# Le séparer en une liste de 3 dataframes :
sp <- split(iris, iris$Species)

# Re-fusionner la liste de dataframes dans un objet "df" :
df <- do.call("rbind", sp)

# Retrouver les rownames d'origine :
rownames(df) <- unlist(lapply(sp, FUN=rownames))

Il semble que cela fonctionne puisque les deux tableaux ont même dimension, mêmes noms de lignes et mêmes valeurs :

Code : Tout sélectionner

> all(rownames(iris)==rownames(df))
[1] TRUE
> all(iris==df)
[1] TRUE

Pourtant, j'ai un curieux résultat avec la fonction identical :

Code : Tout sélectionner

> identical(df, iris)
[1] FALSE


En quoi diffèrent précisément mes deux objets "df" et "iris", étant donné que ceux deux dataframes identiques pour tout ce qui est visible par l'utilisateur ?

Merci !

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Fusionner les dataframes contenus dans une liste

Messagepar Pierre-Yves Berrard » 24 Mar 2019, 20:32

Bonjour,

La seule différence que je vois est dans l'ordre des attributs de chaque data.frame.

Code : Tout sélectionner

identical(attributes(iris), attributes(df))
#> [1] FALSE
PY

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Fusionner les dataframes contenus dans une liste

Messagepar Mickael Canouil » 25 Mar 2019, 09:17

Bonjour,

le comportement n'est pas curieux ici.
Il s'agit de celui prévu et détaillée dans l'aide.

Par exemple, dans l'aide de identical "If attrib.as.set is true, as by default, comparison of attributes view them as a set (and not a vector, so order is not tested)"
Je vous invite à consulter l'aide de ?all.equal et ?identical pour en savoir plus sur le comportement des comparaisons.

Code : Tout sélectionner

# Tableau d'origine :
data(iris)
# Le séparer en une liste de 3 dataframes :
sp <- split(iris, iris$Species)

# Re-fusionner la liste de dataframes dans un objet "df" :
df <- do.call("rbind", sp)

# Retrouver les rownames d'origine :
rownames(df) <- unlist(lapply(sp, FUN=rownames))

iris2 <- iris

Code : Tout sélectionner

all(iris==df)
#> [1] TRUE
all(iris2==iris)
#> [1] TRUE

Code : Tout sélectionner

identical(df, iris)
#> [1] FALSE
identical(iris, iris2)
#> [1] TRUE

Code : Tout sélectionner

all.equal(df, iris)
#> [1] "Attributes: < Component \"row.names\": Modes: character, numeric >"             
#> [2] "Attributes: < Component \"row.names\": target is character, current is numeric >"
all.equal(iris, iris2)
#> [1] TRUE


Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Fusionner les dataframes contenus dans une liste

Messagepar Mickael Canouil » 25 Mar 2019, 09:48

Pourquoi vouloir garder les noms de lignes ?
la plupart des fonctions de R ont des effets secondaires sur les noms de lignes, ainsi stocker une information essentielle dans les noms de lignes me parait excessivement dangereux car peu fiable.

Si on tient vraiment à le faire et qu'on travaille avec des data.frame comme c'est le cas dans votre exemple:
Je recommande de remplacer:

Code : Tout sélectionner

# Re-fusionner la liste de dataframes dans un objet "df" :
df <- do.call("rbind", sp)

# Retrouver les rownames d'origine :
rownames(df) <- unlist(lapply(sp, FUN=rownames))

par:

Code : Tout sélectionner

df <- do.call(function(...){rbind(..., make.row.names = FALSE)}, sp)
Mickaël
mickael.canouil.fr | rlille.fr


Retourner vers « Questions en cours »

Qui est en ligne

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