une même opération sur plusieurs dataframes en même temps

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

Jean-Louis Pagnoux
Messages : 11
Enregistré le : 12 Déc 2019, 09:35

une même opération sur plusieurs dataframes en même temps

Messagepar Jean-Louis Pagnoux » 17 Fév 2020, 04:00

Bonjour,
Je souhaiterais effectuer le code suivant

Code : Tout sélectionner

p1 %>% group_by(d) %>%
mutate (POPmax=max(pop,na.rm=TRUE),
      origine="p1")
      
p2 %>% group_by(d) %>%
mutate (POPmax=max(pop,na.rm=TRUE),
      origine="p2")
....

pour 10 dataframes (p1 à p10)
Y aurait-il un moyen d'obtenir un code synthétique qui évite la recopie des lignes 10 fois ?
En vous remerciant pour votre aide pour un débutant en R ! :-)

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

Re: une même opération sur plusieurs dataframes en même temps

Messagepar Logez Maxime » 17 Fév 2020, 08:30

Bonjour,

tout dépend ce que tu souhaites faire. Si tu souhaites modifier les objets initiaux :

Code : Tout sélectionner

for (i in 1:10) {
  assign(sprintf("p%d", i), get(sprintf("p%d", i)) %>%  group_by(d) %>% mutate (POPmax=max(pop,na.rm=TRUE), origine = sprintf("p%d", i)))
  }
Cordialement,
Maxime

Jean-Louis Pagnoux
Messages : 11
Enregistré le : 12 Déc 2019, 09:35

Re: une même opération sur plusieurs dataframes en même temps

Messagepar Jean-Louis Pagnoux » 17 Fév 2020, 10:49

Merci. C'est tout à fait ce que je voulais faire !!
Petite question :
Pourrais-je avoir une explication de ce que fait la ligne de code

Code : Tout sélectionner

assign(sprintf("p%d", i), get(sprintf("p%d", i))

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

Re: une même opération sur plusieurs dataframes en même temps

Messagepar Mickael Canouil » 17 Fév 2020, 11:19

Bonjour,

il manque les ungroup() ;)

Un intérêt à ce que les data.frame soient séparés dans l'environnement ?

Code : Tout sélectionner

library(dplyr)
library(purrr)

p1 <- iris %>% 
  
filter(Species == "setosa") %>% 
  
mutate(pop Petal.LengthSpecies)

p2 <- iris %>% 
  
filter(Species == "virginica") %>% 
  
mutate(pop Petal.LengthSpecies)

p3 <- iris %>% 
  
filter(Species == "versicolor") %>% 
  
mutate(pop Petal.LengthSpecies)
 

Code : Tout sélectionner


p_all 
<- purrr::map_df(# concatenate df or purrr::map() to keep each df in a list
  
.1:3
  .
= function(i) {
    
get(sprintf("p%d"i), envir = .GlobalEnv) %>% 
      
group_by(d) %>% 
      
mutate(
        
POPmax max(popna.rm TRUE), 
        
origine sprintf("p%d"i)
      ) %>% 
      
ungroup()
  }


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

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

Re: une même opération sur plusieurs dataframes en même temps

Messagepar Mickael Canouil » 17 Fév 2020, 11:23

Jean-Louis Pagnoux a écrit :

Code : Tout sélectionner

assign(sprintf("p%d", i), get(sprintf("p%d", i))

get() permet de récupérer un objet dans un environnement donné.
assign() permet d'affecter quelque chose à un objet dans un environnement donné.

Autant dire que sans connaître la notion d'environnement de R, le get/assign est particulièrement "dangereux".
Mickaël
mickael.canouil.fr | rlille.fr


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité