[R-br] Problemas lendo .dbf no R

Augusto Ribas ribas.aca em gmail.com
Quinta Novembro 13 11:53:21 BRST 2014


Opa, talvez você possa tentar o seguinte:


Um exemplo, suponto que vc tenha 20 arquivos:

Quando voce da arquivos <- list.files(pattern="\\.dbf$"), você gostaria de
ver algo como isso que fiz no vetor1 certo?

> vetor1<-paste("corte_estrada_aneis",1:20,".dbf",sep="")
> vetor1
 [1] "corte_estrada_aneis1.dbf"  "corte_estrada_aneis2.dbf"
 "corte_estrada_aneis3.dbf"
 [4] "corte_estrada_aneis4.dbf"  "corte_estrada_aneis5.dbf"
 "corte_estrada_aneis6.dbf"
 [7] "corte_estrada_aneis7.dbf"  "corte_estrada_aneis8.dbf"
 "corte_estrada_aneis9.dbf"
[10] "corte_estrada_aneis10.dbf" "corte_estrada_aneis11.dbf"
"corte_estrada_aneis12.dbf"
[13] "corte_estrada_aneis13.dbf" "corte_estrada_aneis14.dbf"
"corte_estrada_aneis15.dbf"
[16] "corte_estrada_aneis16.dbf" "corte_estrada_aneis17.dbf"
"corte_estrada_aneis18.dbf"
[19] "corte_estrada_aneis19.dbf" "corte_estrada_aneis20.dbf"


Mas o que você ve na verdade é o que está no vetor 2, certo, porque ta tudo
na ordem lexicografia,(Essa palavra é bonita né? Nem sei se escrevi certo,
desculpa)

> vetor2<-sort(vetor1)
> vetor2
 [1] "corte_estrada_aneis10.dbf" "corte_estrada_aneis11.dbf"
"corte_estrada_aneis12.dbf"
 [4] "corte_estrada_aneis13.dbf" "corte_estrada_aneis14.dbf"
"corte_estrada_aneis15.dbf"
 [7] "corte_estrada_aneis16.dbf" "corte_estrada_aneis17.dbf"
"corte_estrada_aneis18.dbf"
[10] "corte_estrada_aneis19.dbf" "corte_estrada_aneis1.dbf"
 "corte_estrada_aneis20.dbf"
[13] "corte_estrada_aneis2.dbf"  "corte_estrada_aneis3.dbf"
 "corte_estrada_aneis4.dbf"
[16] "corte_estrada_aneis5.dbf"  "corte_estrada_aneis6.dbf"
 "corte_estrada_aneis7.dbf"
[19] "corte_estrada_aneis8.dbf"  "corte_estrada_aneis9.dbf"

Mas beleza, você ta vendo o vetor 2 na saida do arquivos <-
list.files(pattern="\\.dbf$"), quando da arquivos.
Uma possibilidade seria reordenar o seu arquivos, antes de fazer a leitura,
da seguinte formula.

Crie um vetor de numeros, usando uma expressão regular para pegar somente
os números, das string do arquivo, depois transforme em numero pro R
entender:


> numeros<-as.numeric(gsub("[a-z_.]", "\\1", vetor2))
> numeros
 [1] 10 11 12 13 14 15 16 17 18 19  1 20  2  3  4  5  6  7  8  9
> vetor2
 [1] "corte_estrada_aneis10.dbf" "corte_estrada_aneis11.dbf"
"corte_estrada_aneis12.dbf"
 [4] "corte_estrada_aneis13.dbf" "corte_estrada_aneis14.dbf"
"corte_estrada_aneis15.dbf"
 [7] "corte_estrada_aneis16.dbf" "corte_estrada_aneis17.dbf"
"corte_estrada_aneis18.dbf"
[10] "corte_estrada_aneis19.dbf" "corte_estrada_aneis1.dbf"
 "corte_estrada_aneis20.dbf"
[13] "corte_estrada_aneis2.dbf"  "corte_estrada_aneis3.dbf"
 "corte_estrada_aneis4.dbf"
[16] "corte_estrada_aneis5.dbf"  "corte_estrada_aneis6.dbf"
 "corte_estrada_aneis7.dbf"
[19] "corte_estrada_aneis8.dbf"  "corte_estrada_aneis9.dbf"


Veja que a numeração ta na ordem dos arquivos, agora ordene pelos numeros
usando order, que ele vai te dar a ordem que você quer pros indices.
> order(numeros)
 [1] 11 13 14 15 16 17 18 19 20  1  2  3  4  5  6  7  8  9 10 12
> numeros[order(numeros)]
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20



Agora você aplica a ordem dos numeros no seu arquivos, que você pegou o ls
do diretorio.
> vetor2[order(numeros)]
 [1] "corte_estrada_aneis1.dbf"  "corte_estrada_aneis2.dbf"
 "corte_estrada_aneis3.dbf"
 [4] "corte_estrada_aneis4.dbf"  "corte_estrada_aneis5.dbf"
 "corte_estrada_aneis6.dbf"
 [7] "corte_estrada_aneis7.dbf"  "corte_estrada_aneis8.dbf"
 "corte_estrada_aneis9.dbf"
[10] "corte_estrada_aneis10.dbf" "corte_estrada_aneis11.dbf"
"corte_estrada_aneis12.dbf"
[13] "corte_estrada_aneis13.dbf" "corte_estrada_aneis14.dbf"
"corte_estrada_aneis15.dbf"
[16] "corte_estrada_aneis16.dbf" "corte_estrada_aneis17.dbf"
"corte_estrada_aneis18.dbf"
[19] "corte_estrada_aneis19.dbf" "corte_estrada_aneis20.dbf"
>

Ai você le tudo usando essa ordem

for (nome_arquivo in arquivos){

g[i] <- read.dbf(paste("I:/qgis_1/exercicio_buffer_L1/testes/teste_1/",
nome_arquivo,sep=""))

               }

Eu acho que isso deve funcionar.
Bem espero ter mais ajudado que atrabalhado :)



Em 12 de novembro de 2014 03:08, Paulo Pimenta <paulopimenta6 em hotmail.com>
escreveu:

> Prezados,
>
> Estou com um problema ao ler arquivos .dbf no R. Abaixo segue a lógica que
> usei em meu código para fazer a leitura:
>
>
> ##########################################################################################
>
>
>
> ###########################################################################################
> ##comando para ler um arquivo ".dbf"
>
>             ##
> ##
>
>                                            ##
> ##library("foreign")
>
>                               ##
> ##
>
>                                            ##
> ##read.dbf("I:/qgis_1/exercicio_buffer_L1/testes/teste_1/corte_estrada_aneis.dbf")
>                                            ##
> ##
>
>                                            ##
>
> ###########################################################################################
> ##
> ##Salvando tudo em forma de lista
>
> library("foreign")
>
> setwd("I:/qgis_1/exercicio_buffer_L1/testes/teste_1")
>
> arquivos <- list.files(pattern="\\.dbf$")
>
> x <- lapply(arquivos, read.dbf)
>
> ##Exportando os comprimentos de cada estrada cortada por um anel
>
> for (i in 1:91){
>
>     y[[i]] <- x[[i]]
>     vector_length[i] <- sum(y[[i]][,2])
>
>                }
>
>
> ##########################################################################################
>
> Assim como mostrado no exemplo acima estou lendo um arquivo chamado "corte_estrada_aneis.dbf",
> todavia possui um banco com 91 desses arquivos numerados de forma que seus
> nomes ficam, por exemplo: corte_estrada_aneis.1dbf,
> corte_estrada_aneis2.dbf, corte_estrada_aneis3.dbf, ... até finalmente corte_estrada_aneis91.dbf.
> O problema na leitura dos .dbf consiste que a lógica acima usada por mim
> faz com que a ordenação saia errada, ou seja, ele faz a leitura dos
>  arquivos corte_estrada_aneis1.dbf, corte_estrada_aneis12.dbf, corte_estrada_aneis13.dbf
> e assim por diante. Uma tentativa minha, porém não muito bem sucedida foi a
> seguinte:
>
>
> #########################################################################################
>
> library("foreign")
>
> for (i in 1:9){
>
> g[i] <-
> read.dbf("I:/qgis_1/exercicio_buffer_L1/testes/teste_1/corte_estrada_aneis[i].dbf")
>
>                }
>
> g
>
>
> #########################################################################################
>
> Mas como tudo esta contido em " " o índice [i] será lido literalmente.
> Peço ajuda aos colegas para poder solucinar este problema, seja com a minha
> lógica ou com alguma idéia diferente.
>
> Abraços a todos!
>
> Paulo Henrique de A. S. Pimenta.
>
> Graduando em Meteorologia (Bacharelado) - IAG/USP.
> Fone: +5511981318435.
>
> _______________________________________________
> R-br mailing list
> R-br em listas.c3sl.ufpr.br
> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça
> código mínimo reproduzível.
>



-- 
Grato
Augusto C. A. Ribas

Site Pessoal: http://recologia.com.br/ <http://augustoribas.heliohost.org>
Github: https://github.com/Squiercg
Lattes: http://lattes.cnpq.br/7355685961127056
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20141113/eaa31741/attachment.html>


Mais detalhes sobre a lista de discussão R-br