Reescrever como um loop para definir variáveis ​​selecionadas em dataframes semelhantes como fatores, em R

Nov 24 2020

Tenho muitos anos de dados, cada um em um dataframe idêntico, quero colocar todos os anos em uma lista e, em seguida, escrever um loop for em vez de repetir o comando para cada ano.

#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)

Tentei colocar todos os dataframes em uma lista para poder executar um loop, mas não mudou os dataframes ...

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

Respostas

1 GregorThomas Nov 24 2020 at 20:12

Um aninhado lapplyfuncionará para isso:

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

Aqui está um exemplo reproduzível que demonstra que funciona:

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

Podemos usar tidyverse

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

dados

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