Loop de for com três variáveis

classic Clássica list Lista threaded Em Árvore
2 mensagens Opções
Responder | Em Árvore
Abra essa mensagem na visão em árvore
|

Loop de for com três variáveis

cecilimendes
Oi Gente,

estou tentando criar diferentes dataframes com cada página dos pdfs que baixei da internet. Enquanto estava fazendo com apenas duas variáveis no loop (i,j) tava funcionando, porém quando inclui a variável k e a função de transformar o resultado em dataframe o loop só cria os dois primeiros dataframes. Alguém consegue enxergar porque?
Abaixo o código que tenho até agora
localidade <- c("Paranagua", "imbetiba")

loc <- c("belem", "cabedelo", "paranagua_cais_oeste", "suape","recife",  "ilha_de_fernando_de_noronha_baia_de_santo_antonio", "luis_correia", "rio_de_janeiro_ilha_fiscal", "angra_dos_reis", "terminal_maritimo_de_imbetiba", "natal_capitania_dos_portos_do_rn", "maceio", "rio_grande", "florianopolis", "itajai", "santos_torre_grande", "sao_sebastiao", "capitania_dos_portos_de_sergipe", "santana_cia._docas_de_santana", "salvador", "ilheus_malhado", "mucuripe", "terminal_portuario_do_pecem", "vitoria_capitania_dos_portos_do_es", "terminal_da_ponta_do_ubu", "sao_luis", "ilha_da_trindade", "areia_branca_termisa")

loc <- as.data.frame(loc)

localidade <- as.data.frame(localidade)

for (i in 1:nrow(localidade))
      {
      localidade$busca[i] <- grep(pattern= localidade[i,1], x=loc [,1], ignore.case = T, value = T)
     
}

obj <- as.data.frame(NA)


for (i in localidade$busca)

       {

  obj[i] <- as.character(paste(i,"_2018.pdf", sep = ""))
  locais <- paste0("https://www.marinha.mil.br/chm/sites/www.marinha.mil.br.chm/files/dados_de_mare/", i, "_2018.pdf")
  tabua <- paste0(getwd(), "/", basename(locais))
 
  download.file(locais, tabua)
 



 
      }




#
# 2. Converter os arquivos .pdf baixados para .txt para facilitar a busca de padr?es
library(pdftools)
library(stringr)
library(tidyr)


for (i in 2:length(obj))
      {
      assign(paste("tabua",i, sep = ""), strsplit(x = pdf_text(paste(obj[i])),  split = c("\r\n")))
     
        for (j in 1:(length(get(paste("tabua",i, sep = "")))*(length(obj)-1)))
      {
      for (k in 1:3)
      {
                 
      assign(paste("tabua",j, sep = "_"), get(paste("tabua",i, sep = ""))[[k]][c(-1,-2,-3,-4,-5)])
            assign(paste("tabua", j, sep = ""), as.data.frame(get(paste("tabua",j, sep = "_"))))
           
}
}
}
Responder | Em Árvore
Abra essa mensagem na visão em árvore
|

Re: Loop de for com três variáveis

danilomuniz
Cecili, não entendi totalmente a lógica do seu algoritmo, mas acho que o problema é análogo a um problema de indexação.

Vc tem 3 fors, cada um com seu índice, i, j e k. Dentro do for_k (por assim dizer), vc usa o assign() pra criar objetos "tabua", mas na  hora de criar os nomes desses objetos, vc
usa a indexação j, com isso, a cada rodada do for_j, ele roda o for_k novamente e cria novos objetos tabua por cima dos que ele tinha criado antes.
Rodando seu exemplo aqui ele só criou tabua_1 e tabua_2. Então, na hora de criar os objetos, vc teria que usar mais de um índice (fiquei em dúvida se vai precisar incluir até o índice i).

Mas, sinceramente, eu não acho boa ideia usar assign() pra criar objetos com determinados nomes.
Eu recomendo fortemente fazer uma lista, isso vai facilitar até a sua vida na
hora de acessar a informação armazenada, afinal com a lista é só usar indexação.
(dependendo da estrutura dos dados, não precisa ser uma lista, talvez funcione com uma matriz, array ou data.frame)