2016
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)
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
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=",")
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
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.
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])
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"
É 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"
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
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.
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.
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
Por exemplo, seja a seguinte tabela neste artigo da Wikipedia:
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
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