Importação de Dados Locais

Análise de Dados Financeiros e Econômicos com o R

Marcelo S. Perlin

EA-UFRGS

27/08/2026

Importação de dados locais no R

Formatos disponíveis

Dados são serializados ou salvos em texto em diferentes tipos de arquivos.

Em ordem de popularidade:

  • Dados delimitados em texto (csv, tsv);
  • Planilhas do Microsoft Excel (xls, xlsx);
  • Arquivos de dados nativos do R (RData e rds)
  • SQLite (SQLITE) e outros bancos de dados
  • Texto não estruturado (txt)
  • Formato parquet
  • Formato fst (fst)
  • Outros notáveis: Feather

Pontos importantes

  • o local do arquivo no sistema deve ser indicado explicitamente no código. Use o autocomplete com tecla tab
my_file <- 'C:/Data/MyData.csv'
  • Note o uso de barras (/) para designar o diretório do arquivo. Referências relativas também funcionam, tal como em:
my_file <- 'Data/MyData.csv'
  • os dados serão importados e exportados no R como objetos do tipo dataframe.

Pacote afedR3

Pacote afedR3 (Perlin 2023) é o pacote oficial do livro, contendo diversos arquivos de dados de exemplo.

Passos:

  1. Instale o pacote remotes (caso ainda não o tenha feito) e depois instale afedR3 com comando remotes::install_github("msperlin/afedR3")
  2. Após instalação, verifique os dados disponíveis com o comando abaixo:
afedR3::data_list()
  • Para ter o caminho completo de cada arquivo, basta usar função afedR3::data_path tendo o nome do arquivo como entrada:
# get location of file
my_f <- afedR3::data_path('CH11_grunfeld.csv')

# print it
print(my_f)
/home/msperlin/R/x86_64-pc-linux-gnu-library/4.6/afedR3/extdata/data/CH11_grunfeld.csv

Arquivos csv

Introdução

  • formato mais popular em análise de dados
  • arquivos texto que podem ser abertos por qualquer editor/plataforma
  • comportam dados volumosos e podem ser facilmente compactados para .zip ou .tar.gz
  • funciona apenas para objetos do tipo dataframes
  • a importação pode ser problemática, dependendo de onde o arquivo é gerado

Argumentos da função readr::read_csv

help("read_csv", package = 'readr')

Importação

# get location of file
my_f <- afedR3::data_path('CH04_ibovespa.csv')

df <- readr::read_csv(my_f)
print(df)
# A tibble: 3,215 × 2
   ref_date   price_close
   <date>           <dbl>
 1 2010-01-04       70045
 2 2010-01-05       70240
 3 2010-01-06       70729
 4 2010-01-07       70451
 5 2010-01-08       70263
 6 2010-01-11       70433
 7 2010-01-12       70076
 8 2010-01-13       70385
 9 2010-01-14       69801
10 2010-01-15       68978
# ℹ 3,205 more rows

Algumas dicas para lidar com csv

  1. Verifique a existência de texto antes dos dados e a necessidade de ignorar algumas linhas iniciais.

  2. Verifique a existência ou não dos nomes das colunas na primeira linha com os dados.

  3. Verifique qual o símbolo de separador de colunas. Comumente, seguindo notação internacional, será a vírgula, porém nunca se tem certeza sem checar;

  4. Para dados numéricos, verifique o símbolo de decimal, o qual deve ser o ponto (.) tal como em 2.5. Caso necessário, podes ajustar o símbolo na própria função de leitura;

  5. Verifique a codificação do arquivo de texto (UTF-8, Latin1 (ISO-8859) ou windows1252) e ajuste o código de importação para sincronizar a codificação.

  6. Nunca modifique dados brutos manualmente. Sempre que você encontrar uma estrutura de texto inesperada em um arquivo .csv, use os argumentos da função de leitura csv para importar as informações corretamente.

Um arquivo problemático (1/2)

Agora, vamos estudar um caso mais anormal de arquivo .csv. No pacote do livro temos um arquivo chamado CH04_funky-csv-file.csv onde:

  • o cabeçalho possui texto com informações dos dados;
  • o arquivo usará a vírgula como decimal;
  • o texto do arquivo conterá caracteres latinos.

As primeiras 10 linhas dos arquivos contém o seguinte conteúdo:

my_f <- afedR3::data_path('CH04_funky-csv-file.csv')

readr::read_lines(my_f, n_max = 10)
 [1] "Example of funky file:"                    
 [2] "- columns separated by \";\""              
 [3] "- decimal points as \",\""                 
 [4] ""                                          
 [5] "Data build in 2022-12-28"                  
 [6] "Origin: www.funkysite.com.br"              
 [7] ""                                          
 [8] "ID;Race;Age;Sex;Hour;IQ;Height;Died"       
 [9] "001;White;80;Male;00:00:00;92;68;FALSE"    
[10] "002;Hispanic;25;Female;00:00:00;99;68;TRUE"

Um arquivo problemático (2/2)

my_locale <- readr::locale(decimal_mark = ',')

df_not_funky <- readr::read_delim(
  file = my_f, 
  skip = 7, # how many lines do skip
  delim = ';', # column separator
  col_types = readr::cols(), # column types
  locale = my_locale # locale
)

dplyr::glimpse(df_not_funky)
Rows: 100
Columns: 8
$ ID     <chr> "001", "002", "003", "004", "005", "006", "007", "008", "009", …
$ Race   <chr> "White", "Hispanic", "Asian", "White", "White", "White", "White…
$ Age    <dbl> 80, 25, 25, 64, 76, 89, 33, 61, 23, 59, 80, 31, 83, 68, 67, 60,…
$ Sex    <chr> "Male", "Female", "Male", "Male", "Female", "Female", "Female",…
$ Hour   <time> 00:00:00, 00:00:00, 00:00:00, 00:00:00, 00:30:00, 00:30:00, 00…
$ IQ     <dbl> 92, 99, 98, 105, 109, 84, 109, 109, 99, 126, 97, 88, 86, 99, 11…
$ Height <dbl> 68, 68, 69, 69, 67, 73, 65, 72, 70, 66, 63, 68, 72, 76, 68, 65,…
$ Died   <lgl> FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE…

Exportação de Dados

library(readr)

# set number of observations
N <- 100

# create dataframe with random data
my_df <- data.frame(y = runif(N),
                    z = rep('a', N))

# write to file
f_out <- tempfile(fileext = '.csv')
readr::write_csv(x = my_df, file = f_out)

Arquivos Excel (xls e xlsx)

Introdução

  • formato popular na indústria por razões de praticidade
  • baixa portabilidade, arquivo pode corromper com o tempo
  • muito difícil de trabalhar com dados volumosos
  • funciona apenas para objetos dataframes
  • EVITEM usar o excel no R!
  • ótima alternativa: Google Sheets

Lendo arquivos Excel

# set file
my_f <- afedR3::data_path("CH04_ibovespa-Excel.xlsx")

# read xlsx into dataframe
my_df <- readxl::read_excel(my_f, sheet = 'Sheet1')

# glimpse contents
dplyr::glimpse(my_df)
Rows: 3,215
Columns: 2
$ ref_date    <dttm> 2010-01-04, 2010-01-05, 2010-01-06, 2010-01-07, 2010-01-0…
$ price_close <dbl> 70045, 70240, 70729, 70451, 70263, 70433, 70076, 70385, 69…

Exportação de Dados

# set number of rows
N <- 50

# create random dataframe
my_df <- data.frame(y = seq(1,N),
                    z = rep('a',N))

# write to xlsx
f_out <- tempfile(fileext = '.xlsx')
writexl::write_xlsx(
  my_df, 
  f_out
)

Arquivos .rds

Introdução

  • RDS = R Data Serialization
  • formato nativo do R (só é usado no R!)
  • rápido acesso e arquivo resultante é relativamente compacto
  • funciona em qualquer tipo de objeto no R (listas são ótimas para salvar em .rds!)
  • ótima opção para projetos exclusivos do R!
  • péssima opção para compartilhar dados

Importação de Dados

# set file path
my_file <- afedR3::data_path('CH04_example-rds.rds')

# load content into workspace
my_df <- readr::read_rds(file = my_file)
dplyr::glimpse(my_df)
Rows: 3,215
Columns: 2
$ ref_date    <dttm> 2010-01-04, 2010-01-05, 2010-01-06, 2010-01-07, 2010-01-0…
$ price_close <dbl> 70045, 70240, 70729, 70451, 70263, 70433, 70076, 70385, 69…

Exportação de Dados

# set data and file
df <- data.frame(
  x = 1:100
)

my_file <- fs::file_temp(ext = '.rds')

# save as .rds
readr::write_rds(df, my_file)

Arquivos fst (pacote fst)

Introdução

  • formato fst foi especialmente desenhado para possibilitar a gravação e leitura de dados tabulares de forma rápida e com mínimo uso do espaço no disco.
  • usa todos os núcleos da máquina na importação e exportação (computação paralela)
  • baixa portabilidade (funciona apenas no R)
  • funciona apenas para objetos dataframes
  • ótima opção para trabalhar com volumosas bases de dados em computadores potentes.

Importação de Dados

O uso do formato fst é bastante simples. Utilizamos a função read_fst para ler arquivos:

my_file <- afedR3::data_path('CH04_example-fst.fst')
my_df <- fst::read_fst(my_file)

dplyr::glimpse(my_df)
Rows: 100
Columns: 8
$ ID     <chr> "001", "002", "003", "004", "005", "006", "007", "008", "009", …
$ Race   <fct> Black, White, Hispanic, Black, White, White, White, White, Hisp…
$ Age    <int> 33, 35, 23, 87, 65, 51, 58, 67, 22, 52, 52, 71, 38, 23, 81, 31,…
$ Sex    <fct> Male, Female, Male, Female, Male, Male, Female, Female, Male, F…
$ Hour   <dbl> 0.00000000, 0.00000000, 0.00000000, 0.00000000, 0.02083333, 0.0…
$ IQ     <dbl> 108, 108, 85, 106, 92, 92, 88, 100, 86, 80, 78, 101, 109, 92, 9…
$ Height <dbl> 72, 63, 77, 72, 71, 74, 64, 69, 63, 72, 70, 67, 70, 74, 71, 70,…
$ Died   <lgl> FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE,…

Exportação de Dados

library(fst)

# create dataframe
N <- 1000
my_file <- tempfile(fileext = '.fst')
my_df <- data.frame(x = runif(N))

# write to fst
write_fst(x = my_df, path = my_file)

Arquivos SQLite

Introdução

  • alta portabilidade (SQLITE é uma tecnologia de banco de dados)
  • permite leituras parciais dos dados (ex. ler apenas uma parte específica dos dados)
  • permite queries personalizadas com a linguagem SQL, e de rápida execução no banco de dados (ex. contar número de casos)
  • permite a criação e acesso a múltiplas tabelas
  • ótima para casos onde o banco de dados fica mudando com novas inserções

Importação de Dados

Assumindo a existência de um arquivo com formato SQLite, podemos importar suas tabelas com o pacote RSQLite:

# set name of SQLITE file
f_sqlite <- afedR3::data_path('CH04_example-sqlite.SQLite')

# open connection
my_con <- RSQLite::dbConnect(drv = RSQLite::SQLite(), 
                             f_sqlite)

# list tables
RSQLite::dbListTables(my_con)
[1] "MyTable1" "MyTable2"
# read table
my_df <- RSQLite::dbReadTable(conn = my_con,
                              name = 'MyTable1') # name of table in sqlite

# print with str
dplyr::glimpse(my_df)
Rows: 1,000
Columns: 2
$ x <dbl> 0.24645265, 0.47972926, 0.36782192, 0.09451063, 0.15353447, 0.014591…
$ G <chr> "B", "B", "A", "A", "A", "A", "A", "B", "B", "A", "A", "A", "A", "A"…
# disconnect
RSQLite::dbDisconnect(my_con)
# open connection
my_con <- RSQLite::dbConnect(drv = RSQLite::SQLite(), 
                             f_sqlite)

# set sql statement
my_SQL_statement <- "select * from myTable2 where G='A'"

# get query
my_df_A <- RSQLite::dbGetQuery(conn = my_con, 
                               statement = my_SQL_statement)

# disconnect from db
RSQLite::dbDisconnect(my_con)

# print with str
print(my_df_A)
              x G
1   0.926352099 A
2   0.130461409 A
3   0.175863242 A
4   0.232315670 A
5   0.847271047 A
6   0.300454626 A
7   0.505549132 A
8   0.612706532 A
9   0.973640711 A
10  0.427328012 A
11  0.643232163 A
12  0.404313738 A
13  0.863017808 A
14  0.582067640 A
15  0.081243903 A
16  0.511236865 A
17  0.415739435 A
18  0.289032060 A
19  0.141296847 A
20  0.282350294 A
21  0.458751757 A
22  0.526832054 A
23  0.753867575 A
24  0.889684120 A
25  0.772471444 A
26  0.185977806 A
27  0.629218919 A
28  0.365952431 A
29  0.696302751 A
30  0.149488677 A
31  0.889382872 A
32  0.227752264 A
33  0.460097400 A
34  0.884215479 A
35  0.593849448 A
36  0.950207171 A
37  0.491693109 A
38  0.340887717 A
39  0.714875318 A
40  0.701968306 A
41  0.683094237 A
42  0.717466356 A
43  0.096669153 A
44  0.882994940 A
45  0.898418804 A
46  0.751427123 A
47  0.494277414 A
48  0.193050413 A
49  0.945227575 A
50  0.282941852 A
51  0.236774936 A
52  0.051087632 A
53  0.665136149 A
54  0.907210830 A
55  0.039371408 A
56  0.996058959 A
57  0.396210951 A
58  0.503992447 A
59  0.229309389 A
60  0.153367392 A
61  0.972175756 A
62  0.996803596 A
63  0.703029326 A
64  0.505097419 A
65  0.624992198 A
66  0.005983939 A
67  0.778237550 A
68  0.879486091 A
69  0.677142647 A
70  0.680076466 A
71  0.309149390 A
72  0.724364248 A
73  0.081005128 A
74  0.195773744 A
75  0.271248960 A
76  0.198184770 A
77  0.535323065 A
78  0.246461361 A
79  0.949368217 A
80  0.368869499 A
81  0.636857475 A
82  0.178245325 A
83  0.330224338 A
84  0.394005301 A
85  0.570282862 A
86  0.783627173 A
87  0.230118092 A
88  0.514861194 A
89  0.372955043 A
90  0.661570268 A
91  0.938298085 A
92  0.716896655 A
93  0.445549869 A
94  0.063092344 A
95  0.715321713 A
96  0.846515060 A
97  0.170744318 A
98  0.297788653 A
99  0.281884598 A
100 0.114622168 A
101 0.199975115 A
102 0.148213929 A
103 0.631335290 A
104 0.341375148 A
105 0.003381719 A
106 0.119352195 A
107 0.686116250 A
108 0.688206532 A
109 0.986772353 A
110 0.406233246 A
111 0.514205438 A
112 0.766021595 A
113 0.988969374 A
114 0.612179970 A
115 0.009857139 A
116 0.164873729 A
117 0.606945420 A
118 0.816810937 A
119 0.420719406 A
120 0.343190229 A
121 0.954517847 A
122 0.376597324 A
123 0.762052210 A
124 0.429517014 A
125 0.383972993 A
126 0.455820148 A
127 0.780624438 A
128 0.453777955 A
129 0.235479327 A
130 0.215236539 A
131 0.733390799 A
132 0.556616992 A
133 0.339270782 A
134 0.096677931 A
135 0.647610575 A
136 0.204342841 A
137 0.892393797 A
138 0.991015281 A
139 0.975770442 A
140 0.090724978 A
141 0.268624977 A
142 0.278527739 A
143 0.024160279 A
144 0.071693659 A
145 0.508144154 A
146 0.542731101 A
147 0.301177149 A
148 0.378465635 A
149 0.582885280 A
150 0.910761612 A
151 0.695478889 A
152 0.876760570 A
153 0.546714167 A
154 0.505731161 A
155 0.389416202 A
156 0.911309490 A
157 0.121257364 A
158 0.265228343 A
159 0.842668906 A
160 0.596051143 A
161 0.290346726 A
162 0.891403693 A
163 0.135668735 A
164 0.513112954 A
165 0.760240173 A
166 0.204069268 A
167 0.458708899 A
168 0.304207415 A
169 0.150496249 A
170 0.455392335 A
171 0.689250448 A
172 0.731839732 A
173 0.513194087 A
174 0.045911065 A
175 0.077938913 A
176 0.422501823 A
177 0.888946917 A
178 0.594177959 A
179 0.000772401 A
180 0.267807344 A
181 0.518853521 A
182 0.458982665 A
183 0.614808618 A
184 0.651095708 A
185 0.310617130 A
186 0.918155938 A
187 0.607143139 A
188 0.871379235 A
189 0.091685703 A
190 0.052513524 A
191 0.795584715 A
192 0.275062672 A
193 0.244508559 A
194 0.942304037 A
195 0.768861659 A
196 0.732745936 A
197 0.161510243 A
198 0.867782422 A
199 0.333334500 A
200 0.123499410 A
201 0.294597098 A
202 0.924806250 A
203 0.013211581 A
204 0.502136462 A
205 0.293409960 A
206 0.541851201 A
207 0.565297378 A
208 0.537220878 A
209 0.097392976 A
210 0.171076477 A
211 0.003422277 A
212 0.784343392 A
213 0.451197762 A
214 0.915918597 A
215 0.103173527 A
216 0.437913735 A
217 0.921286851 A
218 0.478079480 A
219 0.994991626 A
220 0.022179785 A
221 0.072984148 A
222 0.238176641 A
223 0.643777663 A
224 0.793520630 A
225 0.297012517 A
226 0.068111578 A
227 0.757107673 A
228 0.498820626 A
229 0.321404548 A
230 0.217731198 A
231 0.899944647 A
232 0.910686190 A
233 0.183130585 A
234 0.686452494 A
235 0.493071432 A
236 0.508465396 A
237 0.013959167 A
238 0.857537999 A
239 0.590978719 A
240 0.285297255 A
241 0.868929829 A
242 0.212028743 A
243 0.674032006 A
244 0.114149193 A
245 0.714924927 A
246 0.435292426 A
247 0.115961868 A
248 0.300902478 A
249 0.610522194 A
250 0.379911253 A
251 0.998968589 A
252 0.995009037 A
253 0.124609603 A
254 0.146437667 A
255 0.759302137 A
256 0.829778230 A
257 0.987579606 A
258 0.023597134 A
259 0.402881970 A
260 0.452345368 A
261 0.846119321 A
262 0.125659662 A
263 0.257458181 A
264 0.060500893 A
265 0.812751193 A
266 0.702773832 A
267 0.374078532 A
268 0.670494115 A
269 0.716266152 A
270 0.739564987 A
271 0.123911744 A
272 0.363764265 A
273 0.699805295 A
274 0.776751306 A
275 0.683634022 A
276 0.437193016 A
277 0.261643100 A
278 0.486001818 A
279 0.931977411 A
280 0.542853621 A
281 0.848786636 A
282 0.256823368 A
283 0.050028037 A
284 0.364046337 A
285 0.199188419 A
286 0.314096630 A
287 0.520067555 A
288 0.811334877 A
289 0.491309770 A
290 0.808258105 A
291 0.955896893 A
292 0.360627553 A
293 0.019372167 A
294 0.130024280 A
295 0.550582552 A
296 0.960764341 A
297 0.500303162 A
298 0.589746997 A
299 0.585891636 A
300 0.364504737 A
301 0.787379959 A
302 0.754983542 A
303 0.880616508 A
304 0.788129114 A
305 0.353919947 A
306 0.025249580 A
307 0.856631615 A
308 0.670515551 A
309 0.275420740 A
310 0.835649210 A
311 0.764128607 A
312 0.394159542 A
313 0.265838468 A
314 0.793149635 A
315 0.512376317 A
316 0.730728222 A
317 0.948573287 A
318 0.752168447 A
319 0.604246978 A
320 0.362324426 A
321 0.046254941 A
322 0.324566046 A
323 0.863682645 A
324 0.061700232 A
325 0.158599072 A
326 0.237168070 A
327 0.033082395 A
328 0.359889390 A
329 0.162434213 A
330 0.335028057 A
331 0.830749761 A
332 0.935520234 A
333 0.353283584 A
334 0.379289244 A
335 0.373508221 A
336 0.935379629 A
337 0.243931570 A
338 0.390640845 A
339 0.896177036 A
340 0.569293526 A
341 0.386545747 A
342 0.888235533 A
343 0.341790554 A
344 0.126174194 A
345 0.988002169 A
346 0.613237949 A
347 0.748337467 A
348 0.805499309 A
349 0.186720149 A
350 0.372824350 A
351 0.080910842 A
352 0.980277673 A
353 0.341411270 A
354 0.360159365 A
355 0.249056510 A
356 0.951397615 A
357 0.219536307 A
358 0.201122360 A
359 0.244877031 A
360 0.689126274 A
361 0.452157147 A
362 0.649661256 A
363 0.162128859 A
364 0.157761326 A
365 0.972208260 A
366 0.951731103 A
367 0.968805769 A
368 0.885208836 A
369 0.686521530 A
370 0.182236390 A
371 0.957047813 A
372 0.400664274 A
373 0.007870568 A
374 0.838253056 A
375 0.885658464 A
376 0.057809380 A
377 0.583736575 A
378 0.970555000 A
379 0.271083940 A
380 0.594813703 A
381 0.675679840 A
382 0.334528218 A
383 0.283187175 A
384 0.294386018 A
385 0.299641175 A
386 0.865903622 A
387 0.003557601 A
388 0.421218722 A
389 0.082443685 A
390 0.194039945 A
391 0.650057096 A
392 0.829947350 A
393 0.111700469 A
394 0.439731076 A
395 0.777259412 A
396 0.114233164 A
397 0.315941603 A
398 0.220898272 A
399 0.952759225 A
400 0.696684974 A
401 0.239801236 A
402 0.767668467 A
403 0.653098166 A
404 0.221842879 A
405 0.619781852 A
406 0.455488328 A
407 0.204023875 A
408 0.562280837 A
409 0.148360330 A
410 0.989934157 A
411 0.515112721 A
412 0.365594626 A
413 0.251176851 A
414 0.517157963 A
415 0.312127987 A
416 0.188034128 A
417 0.083921957 A
418 0.700435605 A
419 0.007902050 A
420 0.753074585 A
421 0.779323563 A
422 0.235109532 A
423 0.446120111 A
424 0.377682882 A
425 0.342837397 A
426 0.962887671 A
427 0.506225426 A
428 0.361483478 A
429 0.981168809 A
430 0.040619817 A
431 0.999095949 A
432 0.496864149 A
433 0.158177980 A
434 0.902492269 A
435 0.875579790 A
436 0.065833627 A
437 0.829310148 A
438 0.308068602 A
439 0.515544774 A
440 0.530788197 A
441 0.841939675 A
442 0.750884325 A
443 0.905175631 A
444 0.018139372 A
445 0.268582684 A
446 0.810028348 A
447 0.354121235 A
448 0.570098296 A
449 0.908538296 A
450 0.271654702 A
451 0.122734787 A
452 0.096725448 A
453 0.069410657 A
454 0.692685120 A
455 0.704534487 A
456 0.290337166 A
457 0.161966122 A
458 0.088563831 A
459 0.774989676 A
460 0.311390322 A
461 0.422373056 A
462 0.612086240 A
463 0.097239274 A
464 0.812635156 A
465 0.410890778 A
466 0.713143210 A
467 0.237075577 A
468 0.226607314 A
469 0.606837649 A
470 0.984940052 A
471 0.576962335 A
472 0.487879737 A
473 0.009763696 A
474 0.740546395 A
475 0.211289196 A
476 0.720650643 A
477 0.139626243 A
478 0.738707291 A
479 0.421392746 A
480 0.498499945 A
481 0.287402591 A
482 0.207844636 A
483 0.014548046 A
484 0.474968247 A
485 0.939085501 A
486 0.996730078 A
487 0.408733483 A
488 0.772061862 A
489 0.568508964 A
490 0.632695357 A
491 0.472385769 A
492 0.343674735 A
493 0.239805944 A
494 0.524081108 A
495 0.060565255 A
496 0.368740106 A
497 0.439059072 A
498 0.862419368 A
499 0.240683663 A
500 0.394640430 A
501 0.552960492 A
502 0.709385331 A
503 0.377465217 A
504 0.717533311 A
505 0.798312210 A
506 0.799072065 A
507 0.126657001 A
508 0.549237624 A
509 0.272488611 A
510 0.315914629 A
511 0.309198891 A
512 0.019729845 A
513 0.111063816 A
514 0.957443466 A
515 0.321918672 A
516 0.711595626 A
517 0.218747594 A
518 0.166772036 A
519 0.143792155 A
520 0.741075729 A
521 0.853388443 A
522 0.401594725 A

Exportação de Dados

library(RSQLite)

# set number of rows in df
N = 10^6 

# create simulated dataframe
my_large_df_1 <- data.frame(x=runif(N), 
                            G= sample(c('A','B'),
                                      size = N,
                                      replace = TRUE))

my_large_df_2 <- data.frame(x=runif(N), 
                            G = sample(c('A','B'),
                                       size = N,
                                       replace = TRUE))

# set name of SQLITE file
f_sqlite <- tempfile(fileext = '.SQLITE')

# open connection
my_con <- dbConnect(drv = SQLite(), f_sqlite)

# write df to sqlite
dbWriteTable(conn = my_con, name = 'MyTable1', 
             value = my_large_df_1)
dbWriteTable(conn = my_con, name = 'MyTable2', 
             value = my_large_df_2)

# disconnect
dbDisconnect(my_con)

Dados Não-Estruturados e Outros Formatos

Introdução

  • dados podem ser armazenados de forma não-estruturada, tal como um texto qualquer.
  • tornar uma base de dados não-estruturada em estruturada pode ser um trabalho significativo
  • o caso clássico de base de dados não-estruturada remete a importação de texto bruto

O livro Pride and Prejudice

# set file to read
my_f <- afedR3::data_path('CH04_price-and-prejudice.txt')

# read file line by line
my_txt <- read_lines(my_f)

# print 50 characters of first fifteen lines
print(stringr::str_sub(string = my_txt[1:15], 
                       start = 1, 
                       end = 50))
 [1] "                            [Illustration:"        
 [2] ""                                                  
 [3] "                             GEORGE ALLEN"         
 [4] "                               PUBLISHER"          
 [5] ""                                                  
 [6] "                        156 CHARING CROSS ROAD"    
 [7] "                                LONDON"            
 [8] ""                                                  
 [9] "                             RUSKIN HOUSE"         
[10] "                                   ]"              
[11] ""                                                  
[12] "                            [Illustration:"        
[13] ""                                                  
[14] "               _Reading Jane’s Letters._      _Cha"
[15] "                                   ]"              

Exportação de Dados Não-Estruturados

# set file
my_f <- tempfile(fileext = '.txt')

# set some string
my_text <- paste0('Today is ', Sys.Date(), '\n', 
                  'Tomorrow is ', Sys.Date()+1)

# save string to file
readr::write_lines(x = my_text, file = my_f, append = FALSE)
print(read_lines(my_f))
[1] "Today is 2026-08-27"    "Tomorrow is 2026-08-28"

Selecionando o Formato

Qual formato selecionar?

O usuário deve levar em conta três pontos na decisão de formato de arquivos de dados:

  • velocidade de importação e exportação;
  • tamanho do arquivo resultante;
  • compatibilidade com outros programas e sistemas.

Na grande maioria das situações, o uso de arquivos csv satisfaz esses quesitos!

Caso abrir mão de portabilidade não faça diferença ao projeto, o formato rds é ótimo e prático. Se este não foi suficiente para dados maiores, as melhores alternativas são fst e parquet (via pacote arrow), os quais usam o máximo do hardware do computador e oferecem compressão e velocidade excepcionais. Como sugestão, caso puder, apenas evite o formato do Excel, o qual é o menos eficiente de todos.

Comparando o Desempenho dos Formatos (gravação, leitura e tamanho do arquivo)

Código

library(fst)
library(readr)
library(arrow)
library(RSQLite)
library(wakefield)
library(dplyr)
library(purrr)

options(scipen = 999)

# create simulated dataset
set.seed(123)
n_row <- 500000

my_df <- as.data.frame(wakefield::r_data_frame(
  n = n_row,
  id,
  age,
  sex,
  income,
  date_stamp,
  valid
))

# benchmark helper function
benchmark_format <- function(name, write_fn, read_fn, ext, df) {
  f_temp <- fs::file_temp(ext = ext)
  on.exit(unlink(f_temp), add = TRUE)
  
  t_write <- system.time(write_fn(df, f_temp))[3]
  t_read  <- system.time(read_fn(f_temp))[3]
  size_mb <- file.size(f_temp) / 1e6
  
  tibble(
    Formato = name,
    `Tempo de Escrita (s)` = t_write,
    `Tempo de Leitura (s)` = t_read,
    `Tamanho em Disco (MB)` = size_mb
  )
}

# list of format specifications
benchmarks <- list(
  list(name = "csv", ext = ".csv",
       write_fn = \(df, f) write_csv(df, f),
       read_fn  = \(f) read_csv(f, show_col_types = FALSE)),
  list(name = "rds", ext = ".rds",
       write_fn = \(df, f) write_rds(df, f),
       read_fn  = \(f) read_rds(f)),
  list(name = "fst", ext = ".fst",
       write_fn = \(df, f) write_fst(df, f),
       read_fn  = \(f) read_fst(f)),
  list(name = "parquet", ext = ".parquet",
       write_fn = \(df, f) write_parquet(df, f),
       read_fn  = \(f) read_parquet(f)),
  list(name = "sqlite", ext = ".sqlite",
       write_fn = \(df, f) {
         con <- dbConnect(SQLite(), f); on.exit(dbDisconnect(con))
         dbWriteTable(con, "my_table", df)
       },
       read_fn = \(f) {
         con <- dbConnect(SQLite(), f); on.exit(dbDisconnect(con))
         dbReadTable(con, "my_table")
       })
)

# run all benchmarks
df_res <- purrr::map_dfr(benchmarks, \(b) {
  benchmark_format(b$name, b$write_fn, b$read_fn, b$ext, my_df)
})

Resultado

Big Data no R

Introdução

O R carrega todos os dados diretamente na memória RAM (in-memory).

  • Quando o tamanho dos dados excede a RAM disponível, o computador trava (ou desliga sozinho).

  • Na prática, raramente precisamos de todos os dados brutos de uma vez: apenas colunas, filtros ou agregações específicas, o que permite processamento mais eficiente.

  • Pacotes Recomendados:

    • arrow (Apache Arrow): manipulação de arquivos colunares (.parquet) e datasets particionados em disco
    • duckdb: motor SQL analítico e de altíssimo desempenho
    • sparklyr / dbplyr: delegação de processamento pesado para bancos de dados SQL remotos ou clusters Apache Spark.

Exercícios

  1. Crie um dataframe artificial utilizando o pacote wakefield, permitindo definir a quantidade de linhas, o número de colunas e diferentes tipos de variáveis (ex.: texto, numérico, fator, data, booleano):
library(wakefield)

n_row <- 10000
df <- r_data_frame(
  n = n_row,
  id,
  age,
  sex
)

Exporte o dataframe resultante para cada um dos formatos destacados a seguir:

  • csv
  • rds

Qual dos formatos ocupou maior espaço em disco? Podes verificar o tamanho dos arquivos no Windows Explorer ou com a função file.size() no R.

  1. Experimente modificar o código anterior alterando:

    • O número de linhas (ex.: n = 1000000);

    Como o tamanho do arquivo e o tempo de gravação/leitura de cada formato respondem a diferentes tipos e volumes de dados?

  2. No material do livro (pacote afedR3) existe um arquivo de dados chamado CH08_some-stocks-SP500.csv. Usando a função afedR3::data_path, utilize a função readr::read_csv para carregar o seu conteúdo. Utilize a função glimpse para verificar o conteúdo dos dados importados. Quantas colunas e qual o nome de cada coluna da tabela?

  3. Na página da CVM é possível obter informações de todas as empresas atualmente listadas na bolsa em um arquivo disponível no link https://dados.cvm.gov.br/dados/CIA_ABERTA/CAD/DADOS/cad_cia_aberta.csv. Utilizando o R, baixe o arquivo em seu computador, importe os dados diretamente usando readr::read_csv (a função importa diretamente de arquivos compactados, sem necessidade de descompactação explícita). Quantas empresas fazem parte da bolsa atualmente (verifique o número de linhas do dataframe com a função nrow)?

Referências

Perlin, Marcelo S. 2023. afedR3: Data and Functions for Third Edition of Book "Analyzing Financial and Economical Data with r". https://github.com/msperlin/afedR3/.