Réécrire en boucle pour définir les variables sélectionnées dans des dataframes similaires en tant que facteurs, en R

Nov 24 2020

J'ai de nombreuses années de données, chacune dans une trame de données identique, je veux mettre toutes les années dans une liste, puis en écrire une pour la boucle au lieu de répéter la commande pour chaque année.

#set dummies as factors (these dummies repeat across years)
mydummies<-c ('hru_i', 'ge_nonngsother_i','ge_sgt_i')
DF2012[,mydummies]<-lapply(DF2012[,mydummies],factor)
DF2013[,mydummies]<-lapply(DF2013[,mydummies],factor)

J'ai essayé de mettre toutes les dataframes dans une liste pour pouvoir exécuter une boucle, mais cela n'a pas changé les dataframes ...

df.list<- list(DF2012,DF2013)
#want to create a loop here

Réponses

1 GregorThomas Nov 24 2020 at 20:12

Un imbriqué lapplyfonctionnera pour cela:

df.list <- lapply(df.list, function(d) {
  d[mydummies] <- lapply(d[mydummies], factor)
  d
})

Voici un exemple reproductible démontrant que cela fonctionne:

df.list = list(a = head(mtcars), b = head(mtcars))
mydummies = c("cyl", "am")
sapply(df.list, sapply, class)
#      a         b        
# mpg  "numeric" "numeric"
# cyl  "numeric" "numeric"
# disp "numeric" "numeric"
# hp   "numeric" "numeric"
# drat "numeric" "numeric"
# wt   "numeric" "numeric"
# qsec "numeric" "numeric"
# vs   "numeric" "numeric"
# am   "numeric" "numeric"
# gear "numeric" "numeric"
# carb "numeric" "numeric"

df.list <- lapply(df.list, function(d) {
  d[mydummies] <- lapply(d[mydummies], factor)
  d
})

#      a         b        
# mpg  "numeric" "numeric"
# cyl  "factor"  "factor" 
# disp "numeric" "numeric"
# hp   "numeric" "numeric"
# drat "numeric" "numeric"
# wt   "numeric" "numeric"
# qsec "numeric" "numeric"
# vs   "numeric" "numeric"
# am   "factor"  "factor" 
# gear "numeric" "numeric"
# carb "numeric" "numeric"
1 akrun Nov 24 2020 at 20:24

On peut utiliser tidyverse

library(dplyr)
library(purrr)
df.list <- map(df.list, ~ .x %>% 
                    mutate(across(all_of(mydummies), factor)))

Les données

df.list <- list(a = head(mtcars), b = head(mtcars))
mydummies <- c("cyl", "am")