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 lapply
funcionará 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")
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?