Reading Rdatas returning dates frames with different names

Asked

Viewed 33 times

2

I need to read a list of 17 RDATAEach one of them returns one data.frame, but some of these data frames have different names (I don’t know exactly which ones) which would disrupt the code below

lapply(caminhoArquivosPensao, function(x){
  load(x)
  base.pensionistas.semduplicadas$DATA.ADMISSÃO.SERVIDOR.FALECIDO <- dmy(base.pensionistas.semduplicadas$DATA.ADMISSÃO.SERVIDOR.FALECIDO)
  base.pensionistas.semduplicadas$DT_OBITO_INSTITUIDOR <- dmy(base.pensionistas.semduplicadas$DT_OBITO_INSTITUIDOR)
  base.pensionistas.semduplicadas$DT_AFASTAMENTO <- dmy(base.pensionistas.semduplicadas$DT_AFASTAMENTO)
  base.pensionistas.semduplicadas$DT_IMPLANTACAO <- dmy(base.pensionistas.semduplicadas$DT_IMPLANTACAO)

  base.pensionista <- base.pensionistas.semduplicadas %>%
    filter(DT_OBITO_INSTITUIDOR >= dmy("09/06/2017")) %>%
    mutate(DIAS.RECEB = difftime(DT_AFASTAMENTO, DT_IMPLANTACAO, units = c("days"))) %>%
    filter(DIAS.RECEB <=120)
})

The data.frame base.pensionistas.semduplicadas are the most recent, I’ve done with the standard names. How to assign to any variable (in this case a data.frame) the read basis of a Rdata independent of its name?

1 answer

2


There are a few possible solutions. The most recommended is to stop using files .RData and use aquives .rds because they don’t change the environment and help make problems reproducible.

First of all, let’s create files .RData.

save(mtcars, file = "arquivo1.RData")
iris <- dplyr::rename(iris, cyl = Sepal.Length)
save(iris, file = "arquivo2.RData")

# Voltar ao ambiente vazio
rm(list=ls())
ls()
#> character(0)

How do you get around the issue without switching to files .rds:

For the change generated in the world

arquivos <- dir(pattern = "\\.RData$")

extrair_cyl <- function(x) {
  mundo_antigo <- ls()
  load(x)
  mundo_novo <- ls() # ele vai pegar mundo_antigo além do objeto carregado
  nome_objeto <- mundo_novo[!mundo_novo %in% c(mundo_antigo, "mundo_antigo")]
  df <- get(nome_objeto)
  df$cyl
}

extrair_cyl(arquivos[1])
#>  [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4
extrair_cyl(arquivos[2])
#>   [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4
#>  [18] 5.1 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5
#>  [35] 4.9 5.0 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0
#>  [52] 6.4 6.9 5.5 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8
#>  [69] 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4
#>  [86] 6.0 6.7 6.3 5.6 5.5 5.5 6.1 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8
#> [103] 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7
#> [120] 6.0 6.9 5.6 7.7 6.3 6.7 7.2 6.2 6.1 6.4 7.2 7.4 7.9 6.4 6.3 6.1 7.7
#> [137] 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8 6.7 6.7 6.3 6.5 6.2 5.9

Created on 2019-02-28 by the reprex package (v0.2.1)

Use the power of environments

The approach is described here and consists of loading the table in an isolated environment and then bringing the table to a variable.

arquivos <- dir(pattern = "\\.RData$")

extrair_cyl2 <- function(x) {
  novo_ambiente <- new.env()
  load(x, novo_ambiente)
  nome_objeto <- names(novo_ambiente)
  df <- novo_ambiente[[nome_objeto]]
  df$cyl
}

extrair_cyl2(arquivos[1])
#>  [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4
extrair_cyl2(arquivos[2])
#>   [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4
#>  [18] 5.1 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5
#>  [35] 4.9 5.0 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0
#>  [52] 6.4 6.9 5.5 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8
#>  [69] 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4
#>  [86] 6.0 6.7 6.3 5.6 5.5 5.5 6.1 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8
#> [103] 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7
#> [120] 6.0 6.9 5.6 7.7 6.3 6.7 7.2 6.2 6.1 6.4 7.2 7.4 7.9 6.4 6.3 6.1 7.7
#> [137] 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8 6.7 6.7 6.3 6.5 6.2 5.9

Created on 2019-02-28 by the reprex package (v0.2.1)

Environments can also be transformed into lists with as.list(novo_ambiente) and then be handled normally (using 1 as index, for example).

Browser other questions tagged

You are not signed in. Login or sign up in order to post.