Importação de Dados

2016

Ficheiros de Dados

Os dados necessários para realizar análises e inferências costumam encontrar-se em variados formatos e configurações.

Vamos focar-nos em dois exemplos: dados armazenados em ficheiros de texto, e dados disponíveis em páginas na internet.

Para lidar com dados em ficheiros de texto usaremos o pacote readr.

# install.packages("readr")
library(readr)

Pacote `readr`

Este pacote oferece funções que transformam ficheiros de dados em tabelas (data frames).

Um exemplo comum é o uso de ficheiros csv, onde as células estão separadas por vírgulas:

df <- read_csv("data/pew.csv", col_names=TRUE)
head(df[,1:10], 4)
  religion <10k 10-20k 20-30k 30-40k 40-50k 50-75k 75-100k 100-150k >150k
1 Agnostic   27     34     60     81     76    137     122      109    84
2  Atheist   12     27     37     52     35     70      73       59    74
3 Buddhist   27     21     30     34     33     58      62       39    53
4 Catholic  418    617    732    670    638   1116     949      792   633

Pacote `readr`

Existem outras funções similares:

  • read_csv2 assume a separação por ponto e vírgula, o que é útil em Portugal dado usarmos a vírgula como ponto decimal

  • read_tsv assume a separação por tabulação

  • read_delim que recebe o argumento delim onde se pode definir qual o separador

As funções anteriores são casos particulares de read_delim.

Este código faz o mesmo que o do exemplo anterior:

df <- read_delim("data/pew.csv", delim=",")

Pacote `readr`

A função read_fwf permite ler ficheiros com colunas de dimensão fixa. Por exemplo, este ficheiro

# sample data file with fixed width
001 0943 AVFT
002 1465 ATRE
003 9821 TREW

poderia ser lido desta forma

read_fwf("data/fixed_data.txt", fwf_widths(c(3,5,5)), col_types="iic", skip=1)
  X1   X2   X3
1  1  943 AVFT
2  2 1465 ATRE
3  3 9821 TREW

Pacote `readr`

Ficheiros mais simples que contêm um elemento por linha, como este

93
45
12
5
87

podem ser lidos pela função read_lines:

read_lines("data/single_elems.txt")
[1] "93" "45" "12" "5"  "87"

sendo os dados armazenados num vector.

Pacote `readr`

A função read_file lê o ficheiro para uma string. Esta função pode ser útil para ler blocos de texto para posterior análise.



moby.d <- read_file("data/moby-dick.txt")
substr(moby.d, 1, 40)
[1] "<U+FEFF>CHAPTER 1. Loomings.\r\n\r\nCall me Ishmael"
words <- strsplit(moby.d, 
                 split="[^a-zA-Z]+")[[1]]
head(words, 20)
 [1] ""          "CHAPTER"   "Loomings"  "Call"      "me"       
 [6] "Ishmael"   "Some"      "years"     "ago"       "never"    
[11] "mind"      "how"       "long"      "precisely" "having"   
[16] "little"    "or"        "no"        "money"     "in"       



frequencies <- table(words)
barplot(frequencies[order(frequencies, 
                          decreasing=TRUE)][1:10])

plot of chunk unnamed-chunk-7

Pacote `readr`

O pacote contém funções para traduzir strings para valores de outros tipos.

parse_integer(c("1", "2", "3"))
[1] 1 2 3
parse_number(c("$1000", "20%", "3,000"))
[1] 1000   20 3000
parse_logical(c("TRUE ", " ."), na = ".")
[1] TRUE   NA
parse_date("2010-10-01")  # devolve um valor de tipo Date
[1] "2010-10-01"

Pacote `readr`

É possível interpretar datas no formato Português

parse_date("14/06/17", "%d/%m/%y", locale=locale("pt"))
[1] "2017-06-14"
parse_date("14 de Junho de 2017", "%d de %B de %Y", locale=locale("pt"))
[1] "2017-06-14"

Web Scraping

Outra fonte de informação é a internet.

Muito dados estão disponíveis em ficheiros online. Podemos automatizar a sua recolha, deixando que o computador faça o trabalho.

Por vezes os dados que queremos não estão num formato fácil, e têm de ser extraídos de páginas web escritas em HTML.

Vamos explorar algumas possibilidades de o fazer em R

Transferir ficheiros de texto

Se é um ficheiro de texto que pretendemos podemos usar a função url:

moby.url <- url("https://dl.dropboxusercontent.com/u/2614389/pg2701.txt")

moby.d <- readLines(moby.url, n=500) # lê as primeiras n linhas
moby.d[490:500]                      # este é um vector de strings
 [1] ""                                                                         
 [2] "\"Pedestrians in the vicinity of London and elsewhere may recollect"      
 [3] "having seen large curved bones set upright in the earth, either to form"  
 [4] "arches over gateways, or entrances to alcoves, and they may perhaps"      
 [5] "have been told that these were the ribs of whales.\" --TALES OF A WHALE"  
 [6] "VOYAGER TO THE ARCTIC OCEAN."                                             
 [7] ""                                                                         
 [8] "\"It was not till the boats returned from the pursuit of these whales,"   
 [9] "that the whites saw their ship in bloody possession of the savages"       
[10] "enrolled among the crew.\" --NEWSPAPER ACCOUNT OF THE TAKING AND RETAKING"
[11] "OF THE WHALE-SHIP HOBOMACK."                                              

Cada pedido de readLines vai buscar ao servidor mais informação.

Transferir ficheiros de texto

Outra possibilidade é transferir o ficheiro todo de uma vez. Podemos usar a função download.file() para esse efeito:

download.file("http://www.gutenberg.org/cache/epub/2701/pg2701.txt",
              "data/mobydick.txt")
moby.d <- readLines("data/mobydick.txt", n=500) # ler as primeiras 500 linhas

Agora cada pedido de readLines acede ao ficheiro no computador local.

Ler tabelas da web

Vejamos agora como recolher tabelas que se encontram em páginas web.

Por exemplo, em www.bio.ic.ac.uk/research/mjcraw/therbook/data/taxon.txt temos:

"Petals" "Internode" "Sepal" "Bract" "Petiole" "Leaf" "Fruit"
"1" 5.621498349 29.48059578 2.462106579 18.2034091 11.27909704 ...
"2" 4.994616997 28.36024706 2.429320759 17.65204912 11.0408378 ...
"3" 4.767504884 27.25431792 2.570497375 19.4083846 10.49072184 ...
...
taxon_url <- "http://www.bio.ic.ac.uk/research/mjcraw/therbook/data/taxon.txt"
taxon     <- read.table(taxon_url, header=TRUE, row.names=1)
head(taxon, 3)
    Petals Internode    Sepal    Bract  Petiole     Leaf    Fruit
1 5.621498  29.48060 2.462107 18.20341 11.27910 1.128033 7.876151
2 4.994617  28.36025 2.429321 17.65205 11.04084 1.197617 7.025416
3 4.767505  27.25432 2.570497 19.40838 10.49072 1.003808 7.817479

Obter uma tabela HTML

Por exemplo, seja a seguinte tabela neste artigo da Wikipedia:

alt text

Obter uma tabela HTML

Vamos usar o pacote rvest para aceder à tabela e ir buscar a tabela que pretendemos (neste caso será a primeira):

wiki_url <- "http://en.wikipedia.org/wiki/World_record_progression_1500_metres_freestyle"

library(rvest)
wiki.1500 <- read_html(wiki_url)
df        <- html_table( html_nodes(wiki.1500, "table")[[1]] )[,1:5]
head(df,10)
    #    Time                               Name    Nationality
1   1 22:48.4 NA       Taylor, HenryHenry Taylor  Great Britain
2   2 22:00.0 NA   Hodgson, GeorgeGeorge Hodgson         Canada
3   3 21:35.3 NA             Borg, ArneArne Borg         Sweden
4   4 21:15.0 NA             Borg, ArneArne Borg         Sweden
5   5 21:11.4 NA             Borg, ArneArne Borg         Sweden
6   6 20:06.6 NA       Charlton, BoyBoy Charlton      Australia
7   7 20:04.4 NA             Borg, ArneArne Borg         Sweden
8   8 19:07.2 NA             Borg, ArneArne Borg         Sweden
9   9 18:58.8 NA Amano, TomikatsuTomikatsu Amano          Japan
10 10 18:35.7 NA Hashizume, ShiroShiro Hashizume          Japan

Exercício

Ir a http://www.worldometers.info/world-population/population-by-country/ e usar esses dados para contruir a seguinte tabela com a população de cada país:

      country    population
1       China 1,382,323,332
2       India 1,326,801,576
3        U.S.   324,118,787
4   Indonesia   260,581,100
5      Brazil   209,567,920
6    Pakistan   192,826,502
7     Nigeria   186,987,563
8  Bangladesh   162,910,864
9      Russia   143,439,832
10     Mexico   128,632,004