<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>R |</title><link>http://ambientalanalytics.com/tag/r/</link><atom:link href="http://ambientalanalytics.com/tag/r/index.xml" rel="self" type="application/rss+xml"/><description>R</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Wed, 17 Mar 2021 00:00:00 +0000</lastBuildDate><image><url>http://ambientalanalytics.com/media/icon_hu7c1917ae855170f5d843310bb86f2adf_19652_512x512_fill_lanczos_center_3.png</url><title>R</title><link>http://ambientalanalytics.com/tag/r/</link></image><item><title>Para quem só sabe usar martelo, todo problema é um prego. Até rasters em formato netCDF.</title><link>http://ambientalanalytics.com/post/cubodados1/</link><pubDate>Wed, 17 Mar 2021 00:00:00 +0000</pubDate><guid>http://ambientalanalytics.com/post/cubodados1/</guid><description>&lt;p>Nas últimas semanas estive trabalhando em um projeto com dados atmosféricos. Tem sido de grande aprendizado não apenas por ser uma temática nova, mas também pela demanda de processamento de dados.&lt;/p>
&lt;p>Os aprendizados relacionados ao processamento de dados (sua otimização, claro), serão abordados em artigos ainda em produção. Mas um ponto fundamental e que percebi ser ignorado pela maioria, e neste sentido me incluo, é a estrutura de dados dos arquivos raster em netCDF.&lt;/p>
&lt;p>Já vi, e já respodi a muitas pessoas perguntando como carregar dados netCDF no R, com um simples “com o pacote &lt;code>raster&lt;/code>, ora bolas”. No pior das hipóteses, teremos apenas que instalar uma dependencia que é o pacote &lt;code>ncdf4&lt;/code>.&lt;/p>
&lt;p>Pois é, os dados atmosféricos que tenho trabalhado estão em formato netCDF. E usar o pacote &lt;code>raster&lt;/code> para carregá-lo e manipulá-lo, me foi útil enquanto a análise era exploratória. Ao ver o volume de dados crescer de três dias para dois meses e, em seguida para dois anos de dados produzidos a cada três horas do dia, todos os dias, totalizando 731 arquivos, percebi que precisaria deixar de preguiça e entender esse tal de &lt;em>netCDF&lt;/em>.&lt;/p>
&lt;p>Lendo sobre o pacote ncdf4&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>, o formato netCDF é descrito da seguinte forma:&lt;/p>
&lt;blockquote>
&lt;p>“binary data files that are portable across platforms and include metadata information in addition to the data sets.”&lt;/p>
&lt;/blockquote>
&lt;p>Acho nesse fragmento já dá para entender a importância do formato, não?&lt;/p>
&lt;p>Vamos entender isso? Vejam a diferença:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">raster&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## Loading required package: sp&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="n">r.ppm25&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">stack&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;./rasters/ppm25_2019-06-30.nc&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## Loading required namespace: ncdf4&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## class : RasterStack &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## dimensions : 59, 75, 4425, 6 (nrow, ncol, ncell, nlayers)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## resolution : 0.4, 0.4 (x, y)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## extent : -74.19, -44.19, -18.24, 5.36 (xmin, xmax, ymin, ymax)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## crs : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## names : X2019.06.30.12.00.00, X2019.06.30.15.00.00, X2019.06.30.18.00.00, X2019.06.30.21.00.00, X2019.07.01.00.00.00, X2019.07.01.03.00.00&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Aos que já trabalham com o pacote &lt;code>raster&lt;/code> e conhecem os dados raster, poderão ver que, sim, ainda que dependendo do &lt;code>ncdf4&lt;/code>, o raster carrega os dados, aparentemente, sem grandes problemas. O mínimo esperado está aí. Um raster, com um extent, linhas, colunas, células, layers…&lt;/p>
&lt;p>Mas, se os dados estão em &lt;em>netCDF&lt;/em>, e esse tipo de dados permite armazenar metadados também, cadê eles?&lt;/p>
&lt;p>Pois é. Ao ignorar isso, passava por cima desse detalhe como um marreteiro diante de um parafuso.&lt;/p>
&lt;p>Vamos abrir o arquivo com o &lt;code>ncdf4&lt;/code> para começar a identificar alguns pontos importantes, que, por sinal não ficam “apenas” no metadados:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-R" data-lang="R">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ncdf4&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">(&lt;/span>&lt;span class="n">nc.ppm25&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">nc_open&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;./rasters/ppm25_2019-06-30.nc&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## File ./rasters/ppm25_2019-06-30.nc (NC_FORMAT_64BIT):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## 1 variables (excluding dimension variables):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## short pm2p5[longitude,latitude,time] &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## scale_factor: 9.668789576322e-12&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## add_offset: 3.16807559257767e-07&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## _FillValue: -32767&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## missing_value: -32767&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## units: kg m**-3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## long_name: Particulate matter d &amp;lt; 2.5 um&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## standard_name: mass_concentration_of_pm2p5_ambient_aerosol_particles_in_air&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## 3 dimensions:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## longitude Size:75&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## units: degrees_east&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## long_name: longitude&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## latitude Size:59&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## units: degrees_north&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## long_name: latitude&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## time Size:6 *** is unlimited ***&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## units: hours since 1900-01-01 00:00:00.0&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## long_name: time&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## calendar: gregorian&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## 2 global attributes:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## Conventions: CF-1.6&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">## history: 2021-03-17 20:27:56 GMT by grib_to_netcdf-2.20.0: grib_to_netcdf /data/scratch/20210317-2020/8e/_mars-webmars-public-svc-blue-001-6fe5cac1a363ec1525f54343b6cc9fd8-ZAB6WD.grib -o /data/scratch/20210317-2020/b1/_grib2netcdf-webmars-public-svc-blue-000-6fe5cac1a363ec1525f54343b6cc9fd8-VDR6DW.nc -utime&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Antes de comentar toda riqueza e detalhamento de informação que nos brinda o &lt;code>ncdf4&lt;/code>, percebam que o comando é &lt;code>nc_open()&lt;/code>. Não importa de o dado tem uma ou mais “bandas” ou “camadas”. Isso me chamou atenção pois, como acham que vou saber a quantidade de camadas do dados que vou abrir, se ainda não o conheço? Mas enfim. Vamos ao mais importante, os detalhes:&lt;/p>
&lt;p>Veja a estruturação. No arquivo em questão, eu tenho uma &lt;strong>variável&lt;/strong> apenas, que possui vários metadados, garantindo minimamente sua compreensão, como: &lt;em>short_name&lt;/em>, no caso “pm2p5”, &lt;em>units&lt;/em>, para descrever a unidade do dado, &lt;em>long_name&lt;/em> e &lt;em>standart_name&lt;/em>, além de vários outros.&lt;/p>
&lt;p>E vejam também que são identificadas três dimensões: longitude, latitude e &lt;strong>time&lt;/strong>;&lt;/p>
&lt;p>Eis que chegamos ao cubo de dados, não faz sentido?&lt;/p>
&lt;p>Eu tenho uma variável (ppm&amp;lt;2.5) medida para uma mesma área (cena) ao longo do tempo. O &lt;em>netCDF&lt;/em>, como está preparado e pensado para esse tipo de situação já entende os dados como informação de dadta e hora (!) e os organiza como uma dimensão do dado e não atributo. O &lt;code>raster&lt;/code>, por ter outros objetivos, carrega tudo como um stack (empilhamento de camadas) e adiciona uma string “X” ao nome das camadas, já que as mesmas são numéricas e o pacote em questão restringe o prefixo das camadas a texto, não permitindo valores numéricos. Enfim, nos obriga a digitar mais algumas linhas de código para que o dado fique mais apresentável.&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="d-flex justify-content-center">
&lt;div class="w-100" >&lt;img alt="" srcset="
/post/cubodados1/featured_hu86312b47023f0069a22bbb77ab724bb0_45864_7ea188a741d65514e761bc494e61ed0b.webp 400w,
/post/cubodados1/featured_hu86312b47023f0069a22bbb77ab724bb0_45864_0ce9e839a1126b866eac3cf587dc11b2.webp 760w,
/post/cubodados1/featured_hu86312b47023f0069a22bbb77ab724bb0_45864_1200x1200_fit_q75_h2_lanczos_3.webp 1200w"
src="http://ambientalanalytics.com/post/cubodados1/featured_hu86312b47023f0069a22bbb77ab724bb0_45864_7ea188a741d65514e761bc494e61ed0b.webp"
width="760"
height="456"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;p>Fonte da imagem: &lt;a href="https://r-spatial.org/" target="_blank" rel="noopener">r-spatial.org&lt;/a>&lt;/p>
&lt;p>Essa forma de estruturar os dados fará todo o sentido mais à frente quando formos falar um pouco mais do processamento desses dados.&lt;/p>
&lt;p>O pacote &lt;code>ncdf4&lt;/code> está desenvolvido para o que se convêm chamar de CRUD, na área de desenvolvimento de sistemas: &lt;em>Create&lt;/em>, &lt;em>Update&lt;/em> e &lt;em>Delete&lt;/em>. Ou, seja, a ideia é fornecer ferramentas para manipular e ter controle total dos dados, criando, abrindo, alterando dimensões ou atributos e por aí vai. Mas não para visualização nem para as análises. Essas, ficarão para os próximos artigos.&lt;/p>
&lt;p>Enquanto isso, fique à vontade em me contactar, dar uma alô lá &lt;a href="http://t.me/GeoCastBrasil" target="_blank" rel="noopener">no grupo do GeoCastBrasil&lt;/a>, no Telegram ou no nosso &lt;a href="http://youtube.com/GeoCastBrasil" target="_blank" rel="noopener">canal do youtube&lt;/a>.&lt;/p>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>Não pretendo explorar muitos detalhes, mas o nome do pacote (&lt;code>ncdf4&lt;/code>) faz referência à versão 4 de estratura em questão. Portanto, caso você esteja, por algum motivo, usando um arquivo netCDF com versão anterior, o pacote &lt;code>ncdf&lt;/code> segue disponível, ainda que descontinuado.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>SPATIAL RESTORATION PRIORIZATION</title><link>http://ambientalanalytics.com/project/spatialrestorationpriorization/</link><pubDate>Thu, 31 Jan 2019 00:00:00 +0000</pubDate><guid>http://ambientalanalytics.com/project/spatialrestorationpriorization/</guid><description/></item></channel></rss>