No R existe uma gama de ferramentas que permitem importar dados de diferentes tipos. Algumas dessas bibliotecas já estão previamente inseridos no conjunto de funções básicas do R. Outras bibliotecas, no entanto, precisam ser instaladas. Tendo feito a instalação, estas bibliotecas devem ser liberadas sempre que o usuário deseje usá-las.
Para instalar uma biblioteca em seu R, use a função install.packages().
# Para exemplificar, vamos instalar a biblioteca carData, que permite que o usuário acesse um conjunto
# diverso de dados.
install.packages("carData")
Installing package into ‘/home/helson/R/x86_64-pc-linux-gnu-library/3.6’ (as ‘lib’ is unspecified)
Para liberar o uso de uma biblioteca, use a função library()
library(carData)
head(Chile)
| region | population | sex | age | education | income | statusquo | vote | |
|---|---|---|---|---|---|---|---|---|
| <fct> | <int> | <fct> | <int> | <fct> | <int> | <dbl> | <fct> | |
| 1 | N | 175000 | M | 65 | P | 35000 | 1.00820 | Y |
| 2 | N | 175000 | M | 29 | PS | 7500 | -1.29617 | N |
| 3 | N | 175000 | F | 38 | P | 15000 | 1.23072 | Y |
| 4 | N | 175000 | F | 49 | P | 35000 | -1.03163 | N |
| 5 | N | 175000 | F | 23 | S | 35000 | -1.10496 | N |
| 6 | N | 175000 | F | 28 | P | 7500 | -1.04685 | N |
Os dados de coluna fixa são aqueles que são dispostos em um arquivo sem um delimitador de colunas. Em vez disso, as colunas possuem um número fixo de caracteres. Geralmente, cada coluna tem uma posição inicial (soma total dos caracteres em uma linha decorridos desde o primeiro caracter até o caracter inicial da coluna) e um tamanho (quantidade máxima de caracteres na coluna). Algumas funções em R facilitam a extração desse tipo de dados. A função read_fwf, por exemplo, realiza a leitura de dados de coluna fixa de uma maneira simples e eficiente.
read_fwf("nome_do_arquivo", fwf_cols(nome_da_coluna = c(posição_inicial, posição_inicial + tamanho -1)))
Para tanto, é necessário usar o pacote readr
library(readr)
despesas_veiculo <- read_fwf("https://trello-attachments.s3.amazonaws.com/5f762ac8ad3ca64b6a8db0a4/5f7a5dfdd62c9a41a4842e3a/0fd57b9c5b06920f6a02f00fb09dc308/T_DESPESA_VEICULO_S.txt",
fwf_cols(tipo_registro = c(1, 2), codigo_uf = c(3,4), numero_sequencial = c(5,7),
dv_sequencial = c(8,8), num_domicilio = c(9,10),
despeza_deflacionado = c(83,98)))
head(despesas_veiculo)
── Column specification ──────────────────────────────────────────────────────── cols( tipo_registro = col_double(), codigo_uf = col_double(), numero_sequencial = col_character(), dv_sequencial = col_double(), num_domicilio = col_character(), despeza_deflacionado = col_character() )
| tipo_registro | codigo_uf | numero_sequencial | dv_sequencial | num_domicilio | despeza_deflacionado |
|---|---|---|---|---|---|
| <dbl> | <dbl> | <chr> | <dbl> | <chr> | <chr> |
| 13 | 11 | 001 | 9 | 01 | 0000000083512.16 |
| 13 | 11 | 001 | 9 | 01 | 0000000077438.54 |
| 13 | 11 | 001 | 9 | 04 | 0000000021088.93 |
| 13 | 11 | 001 | 9 | 05 | 0000001623847.48 |
| 13 | 11 | 001 | 9 | 05 | 0000000105444.64 |
| 13 | 11 | 002 | 7 | 03 | 0000001964270.03 |
read.csv(file, sep, dec,...); sep é o separador de colunas e dec é o separador decimal.
Para testar vamos importar os dados sobre os estádios de futebpl do estados de alagoas disponíveis em
dados <- read.csv("http://dados.al.gov.br/dataset/1870ba20-2c86-4c97-ab39-cf1bc0aebc61/resource/a766e1b6-1f06-4bc6-ad9e-9a78bea9c756/download/estadiosdefutebol.csv", sep = ",")
head(dados)
| Name | Cidade | Propriedade | Capacidade | Obs. | Longitude | Latitude | |
|---|---|---|---|---|---|---|---|
| <fct> | <fct> | <fct> | <fct> | <fct> | <dbl> | <dbl> | |
| 1 | Estádio José Gomes da Costa | Murici | Particular | 3.000 Pessoas | Atende ao Murici Futebol Clube | -35.94412 | -9.312147 |
| 2 | Estádio Olival Elias de Moraes | Boca da Mata | Particular | 2.500 pessoas | -36.21095 | -9.643294 | |
| 3 | Estádio Edson Matias | Olho D'Agua das Flores | Particular | 3.000 Pessoas | -37.29390 | -9.530301 | |
| 4 | Estádio Alfredo Leahy | Penedo | Municipal | 2.000 pessoas. | -36.57129 | -10.285275 | |
| 5 | Estádio Adalberto Cavalcante | Porto Real do Colégio | 2.000 Pessoas | Também conhecido como"a toca do jacaré" | -36.83224 | -10.188196 | |
| 6 | Estádio Governador Arnon de Mello | Santana de Ipanema | Ipanema Atlético Clube | 3.000 pessoas | -37.25031 | -9.364155 |
Além da função read.csv, é possível importar os dados em formato .csv por meio de demais funções como read.csv2, read.delim, e read.table.
Verificar o funcionamento das funções citadas
Para importar dados neste formato, podemos usar a biblioteca readxl. Esta biblioteca possibilita a importação de dados neste formato por meio das funções read_excel e read_xls
library(readxl)
dt <- read_xls("~/trabalhos/CURSO_R_PPGER/Aula2/whostat2005_mortality.xls", skip = 1, col_names= T)
head(dt)
New names: * `` -> ...3 * `` -> ...5 * `` -> ...7 * `` -> ...9 * `` -> ...11
| Country | WHO region | ...3 | Life expectancy | ...5 | Healthy life expectancy (HALE) | ...7 | Probability of dying per 1000 population | ...9 | Probability of dying per 1000 live births | ...11 | Maternal |
|---|---|---|---|---|---|---|---|---|---|---|---|
| <chr> | <chr> | <lgl> | <chr> | <chr> | <chr> | <chr> | <chr> | <chr> | <chr> | <chr> | <chr> |
| NA | NA | NA | Male | female | Male | female | Male | female | Male | female | NA |
| Afghanistan | EMR | NA | 41 | 42 | 35.299999999999997 | 35.799999999999997 | 510 | NA | 257 | 60 | 1900 |
| Albania | EUR | NA | 69 | 75 | 59.5 | 63.299999999999997 | 167 | 448 | 21 | 12 | 55 |
| Algeria | AFR | NA | 69 | 72 | 59.700000000000003 | 61.600000000000001 | 155 | 92 | 41 | 20 | 140 |
| Andorra | EUR | NA | 78 | 84 | 69.799999999999997 | 74.599999999999994 | 107 | 125 | 5 | 4 | ... |
| Angola | AFR | NA | 38 | 42 | 31.600000000000001 | 35.100000000000001 | 584 | 41 | 260 | 54 | 1700 |
# Renomeando as colunas com letras do alfabeto
names(dt) <- letters[1:length(dt)]
head(dt)
| a | b | c | d | e | f | g | h | i | j | k | l | m | n |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| <dbl> | <lgl> | <chr> | <chr> | <lgl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <chr> |
| 1 | NA | Afghanistan | EMR | NA | 41 | 42 | 35.3 | 35.8 | 510 | 448 | 257 | 60 | 1900 |
| 2 | NA | Albania | EUR | NA | 69 | 75 | 59.5 | 63.3 | 167 | 92 | 21 | 12 | 55 |
| 3 | NA | Algeria | AFR | NA | 69 | 72 | 59.7 | 61.6 | 155 | 125 | 41 | 20 | 140 |
| 4 | NA | Andorra | EUR | NA | 78 | 84 | 69.8 | 74.6 | 107 | 41 | 5 | 4 | ... |
| 5 | NA | Angola | AFR | NA | 38 | 42 | 31.6 | 35.1 | 584 | 488 | 260 | 54 | 1700 |
| 6 | NA | Antigua and Barbuda | AMR | NA | 70 | 75 | 60.1 | 63.6 | 193 | 122 | 12 | 8 | ... |
Agora suponha que eu queira importar apenas as informações dispostas nas colunas C e D entre as linhas 20 e 50. Podemos especificar esta opção por meio do parâmetro range
dt <- read_xls("~/trabalhos/CURSO_R_PPGER/Aula2/whostat2005_mortality.xls", range = "C20:D50", col_names = F)
head(dt)
New names: * `` -> ...1 * `` -> ...2
| ...1 | ...2 |
|---|---|
| <lgl> | <dbl> |
| NA | 75 |
| NA | 65 |
| NA | 52 |
| NA | 61 |
| NA | 63 |
| NA | 69 |
Também é possível importar dados em formato .xlsx com a função read_excel do pacote readxl
dt1 <- read_excel("~/Documentos/repositorios/ds-py-public/data/pesquisa_familiar.xlsx")
head(dt1)
| ano | id_dom | individuo | sexo | idade | anos_estudo | renda_trabalho | consumo_vite | obeso |
|---|---|---|---|---|---|---|---|---|
| <dbl> | <dbl> | <dbl> | <chr> | <dbl> | <dbl> | <dbl> | <dbl> | <chr> |
| 2014 | 1 | 2 | M | 35 | 3 | 724 | 6.88 | F |
| 2014 | 5 | 2 | F | 21 | 0 | 790 | 9.60 | F |
| 2014 | 3 | 1 | F | 32 | 5 | 1200 | 8.69 | T |
| 2014 | 6 | 2 | F | 52 | 7 | 1800 | 10.78 | T |
| 2014 | 7 | 1 | M | 27 | 7 | 1800 | 12.14 | T |
| 2014 | 1 | 1 | F | 52 | 11 | 2400 | 5.53 | F |
Outros pacotes também facilitam a importação de dados no formato .xlsx, como por exemplo, o pacote openxlsx
library(openxlsx)
dt1 <- read.xlsx("~/Documentos/repositorios/ds-py-public/data/pesquisa_familiar.xlsx")
head(dt1)
| ano | id_dom | individuo | sexo | idade | anos_estudo | renda_trabalho | consumo_vite | obeso | |
|---|---|---|---|---|---|---|---|---|---|
| <dbl> | <dbl> | <dbl> | <chr> | <dbl> | <dbl> | <dbl> | <dbl> | <chr> | |
| 1 | 2014 | 1 | 2 | M | 35 | 3 | 724 | 6.88 | F |
| 2 | 2014 | 5 | 2 | F | 21 | 0 | 790 | 9.60 | F |
| 3 | 2014 | 3 | 1 | F | 32 | 5 | 1200 | 8.69 | T |
| 4 | 2014 | 6 | 2 | F | 52 | 7 | 1800 | 10.78 | T |
| 5 | 2014 | 7 | 1 | M | 27 | 7 | 1800 | 12.14 | T |
| 6 | 2014 | 1 | 1 | F | 52 | 11 | 2400 | 5.53 | F |
Arquivos em formato .ods são bem semelhantes às planilhas do excel, mas são importados por meio de uma biblioteca específica no R. Nesta demonstração faremos uso da runção read_ods referente ao pacote readODS.
install.packages("readODS")
library(readODS)
Installing package into ‘/home/helson/R/x86_64-pc-linux-gnu-library/3.6’ (as ‘lib’ is unspecified)
exemplo <- read_ods("exemplo.ods")
head(exemplo)
| data | v1 | v2 | v3 | |
|---|---|---|---|---|
| <chr> | <dbl> | <dbl> | <dbl> | |
| 1 | 01/01/19 | 0.1 | 5 | -0.3 |
| 2 | 01/02/19 | 0.7 | 2 | -0.5 |
| 3 | 01/03/19 | 0.9 | 4 | 0.0 |
| 4 | 01/04/19 | 1.1 | 7 | 0.2 |
| 5 | 01/05/19 | 1.7 | 6 | 0.7 |
| 6 | 01/06/19 | 1.9 | 3 | 0.5 |
A extensão .shp é comumente utilizada para armazenar dados geográficos. As informações são armazendadas em um shapefile onde cada linha corresponde a um polígono (ou ponto). O R não disponibiliza uma função nativa para importareste tipo de informação. Paraisso, utilizaremos a função readOGR do pacote rgdal.
install.packages("rgdal")
library(rgdal)
Loading required package: sp
rgdal: version: 1.5-16, (SVN revision 1050)
Geospatial Data Abstraction Library extensions to R successfully loaded
Loaded GDAL runtime: GDAL 3.0.4, released 2020/01/28
Path to GDAL shared files: /usr/share/gdal
GDAL binary built with GEOS: TRUE
Loaded PROJ runtime: Rel. 6.3.1, February 10th, 2020, [PJ_VERSION: 631]
Path to PROJ shared files: /usr/share/proj
Linking to sp version:1.3-2
To mute warnings of possible GDAL/OSR exportToProj4() degradation,
use options("rgdal_show_exportToProj4_warnings"="none") before loading rgdal.
shape <- readOGR("/media/helson/DOCUMENTOS/shapefiles/BR_MUN1997_NE_region.shp")
Warning message in OGRSpatialRef(dsn, layer, morphFromESRI = morphFromESRI, dumpSRS = dumpSRS, : “Discarded ellps South_American_1969 in CRS definition: +proj=longlat +a=6378160 +rf=298.249997276159 +no_defs” Warning message in OGRSpatialRef(dsn, layer, morphFromESRI = morphFromESRI, dumpSRS = dumpSRS, : “Discarded datum D_SA1969 in CRS definition: +proj=longlat +a=6378160 +rf=298.249997276159 +no_defs” Warning message in showSRID(wkt2, "PROJ"): “Discarded ellps South_American_1969 in CRS definition: +proj=longlat +a=6378160 +rf=298.249997276159 +no_defs” Warning message in showSRID(wkt2, "PROJ"): “Discarded datum D_SA1969 in CRS definition”
OGR data source with driver: ESRI Shapefile Source: "/media/helson/DOCUMENTOS/shapefiles/BR_MUN1997_NE_region.shp", layer: "BR_MUN1997_NE_region" with 1787 features It has 21 fields
Muitas informações são disponibilizada na forma de um JavaScript Object Notation (json). Esses objetos são geralmente relacionados à exposição de informações ou criação de aplicações computacionais na linguagem Java script. A vantagem de se utilizar este formato de exposição de dados é que geralmente as informações são armazenadas em menos espaço do que os formatos convencionais.
Nesta especificação é possível inserir várias planílias dentro de um único arquivo. Cada planilha é agrupada dentro de chaves {}. Dentro da planilha, as colunas recebem um nome especificado entre aspas e os valores das informações de cada coluna são expostos entre colchetes e são separados por vírgula um a um.
Exemplo de um arquivo .json
{"Idade":["20","25","30","40","50"], "Escolaridade":["7", "5", "6", "7", "4"]}
Para importar este tipo de arquivo, é necessário usar uma biblioteca específica. Neste documento, faremos uso da biblioteca rjson. Instale-a em sua máquina.
install.packages('rjson')
library(rjson)
Installing package into ‘/home/helson/R/x86_64-pc-linux-gnu-library/3.6’ (as ‘lib’ is unspecified)
Para testar a biblioteca vamos salvar o exemplo digitado acima no formato .json e importar para o R usando a função fromJSON.
df <- fromJSON(file = "example1.json")
df
Tendo importado o arquivo, o próximo passo é transformá-lo em um data frame.
df <- as.data.frame(df)
df
| Idade | Escolaridade |
|---|---|
| <fct> | <fct> |
| 20 | 7 |
| 25 | 5 |
| 30 | 6 |
| 40 | 7 |
| 50 | 4 |
Os dados em Extensible Markup Language (XML) são usados em arquivos de marcação. A principal característica desses dados é que as informações são armazenadas em tags. Além disso, destaca-se também que nesse tipo de informação os dados geralmente são dispostos de forma hierárquica. A principal vantagem do armazenamento de dados no formato .xml está na possibilidade de integração com outras linguagens. Por ser uma ferramenta de marcação, o XML pode ser facilmente compreendido por um conjunto de linguagens de programação.
Para exemplificar, suponha que queiramos criar uma base de dados com informações de emprego para oito indivíduos. A base de dados terá seis colunas de nomes ID, NAME, SALARY, STARTDATE e DEPT. O nosso arquivo .xml terá a seguinte especificação:
Para importar esse tipo de arquivo precisamos utilizar uma biblioteca específica.
install.packages("XML")
library(XML)
# Tendo instalado a biblioteca, usaremos a função xmlParse para importar os dados para o R
emprego <- xmlParse(file = "~/trabalhos/CURSO_R_PPGER/Aula2/emprego.xml")
# Em seguida, utilizaremos a função xmlToDataFrame para transformar os dados importados em um data frame.
tst <- xmlToDataFrame(emprego)
tst
| ID | NAME | SALARY | STARTDATE | DEPT |
|---|---|---|---|---|
| <fct> | <fct> | <fct> | <fct> | <fct> |
| 1 | Rick | 623.3 | 1/1/2012 | IT |
| 2 | Dan | 515.2 | 9/23/2013 | Operations |
| 3 | Michelle | 611 | 11/15/2014 | IT |
| 4 | Ryan | 729 | 5/11/2014 | HR |
| 5 | Gary | 843.25 | 3/27/2015 | Finance |
| 6 | Nina | 578 | 5/21/2013 | IT |
| 7 | Simon | 632.8 | 7/30/2013 | Operations |
| 8 | Guru | 722.5 | 6/17/2014 | Finance |
O sparklyr é um ambiente criado para facilitar as operações com grandes bases de dados. A ferramenta permite a importação de um grande volume de dados sem o comprometimento da memória do dispositivo. A ferramenta é recomendada para ocasiões em que o usuário deseja manipular ou extrair informações de uma base de dados muito grande.
install.packages("sparklyr")
library(sparklyr)
# Inicialmente é necessário criar uma conexão entre o R e o disco de armazenamento do dispositivo
# É preciso ter o java 8 instalado
sc <- spark_connect(master = "local")
Utilizando as funções nativas é possível alterar as bases de dados de acordo com a necessidade do usuário. Para remonstrar, vamos utilizar umbanco de dados sobre migração
dados <- carData::Migration
head(dados)
| source | destination | migrants | distance | pops66 | pops71 | popd66 | popd71 | |
|---|---|---|---|---|---|---|---|---|
| <fct> | <fct> | <int> | <int> | <int> | <int> | <int> | <int> | |
| 1 | PEI | NFLD | 255 | 924 | 108535 | 111641 | 493396 | 522104 |
| 2 | NS | NFLD | 2380 | 952 | 756039 | 788960 | 493396 | 522104 |
| 3 | NB | NFLD | 1140 | 1119 | 616788 | 534557 | 493396 | 522104 |
| 4 | QUE | NFLD | 2145 | 1641 | 5780845 | 6027764 | 493396 | 522104 |
| 5 | ONT | NFLD | 6295 | 1996 | 6960870 | 7703106 | 493396 | 522104 |
| 6 | MAN | NFLD | 215 | 3159 | 963066 | 988247 | 493396 | 522104 |
# Selecionando apenas as colunas source e pops66
dados1 <- subset(dados, select = c(source, pops66))
head(dados1)
| source | pops66 | |
|---|---|---|
| <fct> | <int> | |
| 1 | PEI | 108535 |
| 2 | NS | 756039 |
| 3 | NB | 616788 |
| 4 | QUE | 5780845 |
| 5 | ONT | 6960870 |
| 6 | MAN | 963066 |
# Excluindo apenas as colunas source e pops66
dados1 <- subset(dados, select = - c(source, pops66))
head(dados1)
| destination | migrants | distance | pops71 | popd66 | popd71 | |
|---|---|---|---|---|---|---|
| <fct> | <int> | <int> | <int> | <int> | <int> | |
| 1 | NFLD | 255 | 924 | 111641 | 493396 | 522104 |
| 2 | NFLD | 2380 | 952 | 788960 | 493396 | 522104 |
| 3 | NFLD | 1140 | 1119 | 534557 | 493396 | 522104 |
| 4 | NFLD | 2145 | 1641 | 6027764 | 493396 | 522104 |
| 5 | NFLD | 6295 | 1996 | 7703106 | 493396 | 522104 |
| 6 | NFLD | 215 | 3159 | 988247 | 493396 | 522104 |
# Suponha que queremos analisar a migração apenas para as cidades com mais de 1.000.000 de habitantes em 1971
dados1 <- subset(dados, popd71 > 1000000)
head(dados1)
| source | destination | migrants | distance | pops66 | pops71 | popd66 | popd71 | |
|---|---|---|---|---|---|---|---|---|
| <fct> | <fct> | <int> | <int> | <int> | <int> | <int> | <int> | |
| 37 | NFLD | QUE | 2235 | 1641 | 493396 | 522104 | 5780845 | 6027764 |
| 38 | PEI | QUE | 635 | 774 | 108535 | 111641 | 5780845 | 6027764 |
| 39 | NS | QUE | 4350 | 832 | 756039 | 788960 | 5780845 | 6027764 |
| 40 | NB | QUE | 7905 | 522 | 616788 | 534557 | 5780845 | 6027764 |
| 41 | ONT | QUE | 48370 | 355 | 6960870 | 7703106 | 5780845 | 6027764 |
| 42 | MAN | QUE | 4630 | 1519 | 963066 | 988247 | 5780845 | 6027764 |
A biblioteca plyr disponibiliza uma série de funções para a manipulação de dados.
install.package("plyr")
library(plyr)
# Para demonstrar vamos criar um banco de dados chamado d
d <- data.frame(year = rep(2000:2002, each = 3),count = round(runif(9, 0, 20)))
d
| year | count |
|---|---|
| <int> | <dbl> |
| 2000 | 12 |
| 2000 | 15 |
| 2000 | 10 |
| 2001 | 3 |
| 2001 | 7 |
| 2001 | 13 |
| 2002 | 5 |
| 2002 | 12 |
| 2002 | 20 |
Gera uma nova coluna com informações de outra coluna do banco de dados, descartando as repetições de uma variável de grupo.
ddply(d, "year", summarise, total.count = sum(count))
| year | total.count |
|---|---|
| <int> | <dbl> |
| 2000 | 37 |
| 2001 | 23 |
| 2002 | 37 |
Gera uma nova coluna com informações de outra coluna do banco de dados, preservando as repetições de uma variável de grupo.
ddply(d, "year", transform, total.count = sum(count))
# obs: c("year", "outra variavel") para agrupar por mais de uma variável
| year | count | total.count |
|---|---|---|
| <int> | <dbl> | <dbl> |
| 2000 | 12 | 37 |
| 2000 | 15 | 37 |
| 2000 | 10 | 37 |
| 2001 | 3 | 23 |
| 2001 | 7 | 23 |
| 2001 | 13 | 23 |
| 2002 | 5 | 37 |
| 2002 | 12 | 37 |
| 2002 | 20 | 37 |
criar uma variável de acordo com outras variáveis do dataframe ou com informações não disponibilizadas no data frame
mutate(d, raiz = sqrt(count), tempo = 2020 - year)
df <- data.frame(sexo = rbinom(50, 1, .4), idade = round(runif(50, 15, 80)), salario = round(runif(50, 750, 3500),2),
ID = 1:50)
df1 <- data.frame(escolaridade = round(runif(80, 0, 10)),
ID = 80:1)
# Podemos usar a função *join* para unir df e df1 de acordo com a variável ID
join(x = df, y = df1, type = "left", match = "all")
Joining by: ID
| sexo | idade | salario | ID | escolaridade |
|---|---|---|---|---|
| <int> | <dbl> | <dbl> | <int> | <dbl> |
| 0 | 60 | 2304.26 | 1 | 7 |
| 1 | 51 | 914.22 | 2 | 1 |
| 1 | 51 | 3176.14 | 3 | 7 |
| 1 | 35 | 925.88 | 4 | 1 |
| 0 | 78 | 2316.35 | 5 | 1 |
| 0 | 20 | 1423.91 | 6 | 4 |
| 1 | 61 | 1569.34 | 7 | 7 |
| 0 | 37 | 1834.31 | 8 | 2 |
| 0 | 24 | 3343.91 | 9 | 10 |
| 0 | 54 | 1094.09 | 10 | 5 |
| 0 | 46 | 2386.53 | 11 | 9 |
| 0 | 38 | 1385.78 | 12 | 4 |
| 0 | 20 | 3291.20 | 13 | 5 |
| 0 | 39 | 2510.37 | 14 | 7 |
| 1 | 58 | 2347.67 | 15 | 3 |
| 1 | 53 | 1034.58 | 16 | 0 |
| 1 | 57 | 967.10 | 17 | 1 |
| 0 | 34 | 2208.98 | 18 | 8 |
| 1 | 36 | 2870.80 | 19 | 3 |
| 0 | 39 | 1233.66 | 20 | 8 |
| 1 | 29 | 916.51 | 21 | 10 |
| 0 | 71 | 1732.29 | 22 | 1 |
| 0 | 53 | 961.96 | 23 | 8 |
| 0 | 74 | 2492.23 | 24 | 9 |
| 1 | 79 | 2048.28 | 25 | 9 |
| 0 | 25 | 2680.67 | 26 | 3 |
| 0 | 46 | 2958.99 | 27 | 7 |
| 0 | 71 | 2366.05 | 28 | 0 |
| 1 | 41 | 1541.48 | 29 | 2 |
| 0 | 53 | 3008.90 | 30 | 5 |
| 0 | 60 | 1422.03 | 31 | 10 |
| 1 | 16 | 3175.56 | 32 | 8 |
| 0 | 51 | 2129.09 | 33 | 6 |
| 0 | 76 | 2778.74 | 34 | 3 |
| 1 | 24 | 1363.29 | 35 | 7 |
| 0 | 36 | 2012.94 | 36 | 2 |
| 1 | 29 | 3412.46 | 37 | 4 |
| 1 | 53 | 2240.11 | 38 | 6 |
| 0 | 54 | 2067.01 | 39 | 8 |
| 0 | 77 | 1072.36 | 40 | 2 |
| 1 | 26 | 2433.76 | 41 | 10 |
| 0 | 42 | 3162.88 | 42 | 6 |
| 0 | 53 | 2808.51 | 43 | 8 |
| 0 | 48 | 2904.61 | 44 | 3 |
| 1 | 74 | 2827.07 | 45 | 4 |
| 1 | 61 | 1078.54 | 46 | 3 |
| 1 | 20 | 1242.37 | 47 | 3 |
| 1 | 55 | 1314.43 | 48 | 6 |
| 0 | 62 | 2648.30 | 49 | 4 |
| 0 | 39 | 1657.61 | 50 | 2 |
# Quem ganha mais, homens ou mulheres?
Dplyr e tidyr são duas bibliotecas do R com escopo voltado para o gerenciamento de dados. As duas bibliotecas possuem funções semelhantes à biblioteca plyr, porém, com algumas funcionalidades adicionais. Esses pacotes fazem parte de uma ferramenta de gerenciamento de dados mais ampla chamada tidyverse.
# Instalando as bibliotecas
install.packages("dplyr")
install.packages("tidyr")
# Ou, alternativamente,
install.packages("tidyverse")
# Liberando as bibliotecas
library(dplyr)
library(tidyr)
# Ou, alternativamente,
#library(tidyverse)
Attaching package: ‘dplyr’
The following objects are masked from ‘package:stats’:
filter, lag
The following objects are masked from ‘package:base’:
intersect, setdiff, setequal, union
A função pip (%>%) é uma função do tidyr criada para indicar que a próxima linha de comando é uma sequência da linha anterior, permitindo que o usuário faça várias operações no mesmo comando.
O pacote dplyr disponibiliza uma série de opções que permitem a criação de variáveis dentro de um data frame por meio da função mutate, sendo que, o própria função possui uma série de subfunções. Para demonstrar, vamos o banco de dados sobre migração utilizado anteriormente.
dados <- carData::Migration
head(dados)
| source | destination | migrants | distance | pops66 | pops71 | popd66 | popd71 | |
|---|---|---|---|---|---|---|---|---|
| <fct> | <fct> | <int> | <int> | <int> | <int> | <int> | <int> | |
| 1 | PEI | NFLD | 255 | 924 | 108535 | 111641 | 493396 | 522104 |
| 2 | NS | NFLD | 2380 | 952 | 756039 | 788960 | 493396 | 522104 |
| 3 | NB | NFLD | 1140 | 1119 | 616788 | 534557 | 493396 | 522104 |
| 4 | QUE | NFLD | 2145 | 1641 | 5780845 | 6027764 | 493396 | 522104 |
| 5 | ONT | NFLD | 6295 | 1996 | 6960870 | 7703106 | 493396 | 522104 |
| 6 | MAN | NFLD | 215 | 3159 | 963066 | 988247 | 493396 | 522104 |
Suponha que queiramos saber o quanto a populaçãodas províncias cresceu entre 1966 e 1971 e que queiramos criar outra variável com a taxa de crescimento da população.
# Primeira maneira
dados <- dados %>% mutate(pop_adicional = popd71 - popd66, taxa_cres6671 = pop_adicional/popd66)
head(dados)
| source | destination | migrants | distance | pops66 | pops71 | popd66 | popd71 | pop_adicional | taxa_cres6671 | |
|---|---|---|---|---|---|---|---|---|---|---|
| <fct> | <fct> | <int> | <int> | <int> | <int> | <int> | <int> | <int> | <dbl> | |
| 1 | PEI | NFLD | 255 | 924 | 108535 | 111641 | 493396 | 522104 | 28708 | 0.0581845 |
| 2 | NS | NFLD | 2380 | 952 | 756039 | 788960 | 493396 | 522104 | 28708 | 0.0581845 |
| 3 | NB | NFLD | 1140 | 1119 | 616788 | 534557 | 493396 | 522104 | 28708 | 0.0581845 |
| 4 | QUE | NFLD | 2145 | 1641 | 5780845 | 6027764 | 493396 | 522104 | 28708 | 0.0581845 |
| 5 | ONT | NFLD | 6295 | 1996 | 6960870 | 7703106 | 493396 | 522104 | 28708 | 0.0581845 |
| 6 | MAN | NFLD | 215 | 3159 | 963066 | 988247 | 493396 | 522104 | 28708 | 0.0581845 |
Para criar uma variável dada por uma determinada condição, use a função mutate() em conjunto com a função ifelse.
mutate(nome_da_variavel = ifelse(condição, valor atribuído caso a condição seja satisfeita, falor atribuído caso a condição não seja satisteita)
# Criando uma variável binária com valor 1 caso a província de destino seja "NFLD" e zero caso contrário
dados <- dados %>%
mutate(NFLD = ifelse(destination == "NFLD", 1, 0))
head(dados)
| source | destination | migrants | distance | pops66 | pops71 | popd66 | popd71 | NFLD | |
|---|---|---|---|---|---|---|---|---|---|
| <fct> | <fct> | <int> | <int> | <int> | <int> | <int> | <int> | <dbl> | |
| 1 | PEI | NFLD | 255 | 924 | 108535 | 111641 | 493396 | 522104 | 1 |
| 2 | NS | NFLD | 2380 | 952 | 756039 | 788960 | 493396 | 522104 | 1 |
| 3 | NB | NFLD | 1140 | 1119 | 616788 | 534557 | 493396 | 522104 | 1 |
| 4 | QUE | NFLD | 2145 | 1641 | 5780845 | 6027764 | 493396 | 522104 | 1 |
| 5 | ONT | NFLD | 6295 | 1996 | 6960870 | 7703106 | 493396 | 522104 | 1 |
| 6 | MAN | NFLD | 215 | 3159 | 963066 | 988247 | 493396 | 522104 | 1 |
Suponha que queiramos criar uma variável que esboça a quantidade média de migrantes recebida por cada província de destino. Para tanto, precisamos fazer uso da função group_by. Podemos fazer isto de duas maneiras.
# 1. Preservando todas as informações da tabela (função mutate)
df <- dados %>% group_by(destination) %>% mutate(media_migrantes = mean(migrants))
head(df)
| source | destination | migrants | distance | pops66 | pops71 | popd66 | popd71 | pop_adicional | taxa_cres6671 | media_migrantes |
|---|---|---|---|---|---|---|---|---|---|---|
| <fct> | <fct> | <int> | <int> | <int> | <int> | <int> | <int> | <int> | <dbl> | <dbl> |
| PEI | NFLD | 255 | 924 | 108535 | 111641 | 493396 | 522104 | 28708 | 0.0581845 | 1496.111 |
| NS | NFLD | 2380 | 952 | 756039 | 788960 | 493396 | 522104 | 28708 | 0.0581845 | 1496.111 |
| NB | NFLD | 1140 | 1119 | 616788 | 534557 | 493396 | 522104 | 28708 | 0.0581845 | 1496.111 |
| QUE | NFLD | 2145 | 1641 | 5780845 | 6027764 | 493396 | 522104 | 28708 | 0.0581845 | 1496.111 |
| ONT | NFLD | 6295 | 1996 | 6960870 | 7703106 | 493396 | 522104 | 28708 | 0.0581845 | 1496.111 |
| MAN | NFLD | 215 | 3159 | 963066 | 988247 | 493396 | 522104 | 28708 | 0.0581845 | 1496.111 |
# 2. Deixando apenas as informações desejadas (função summarise)
dados %>% group_by(destination) %>% summarise(media_migrantes = mean(migrants))
`summarise()` ungrouping output (override with `.groups` argument)
| destination | media_migrantes |
|---|---|
| <fct> | <dbl> |
| ALTA | 13905.0000 |
| BC | 21236.1111 |
| MAN | 6266.1111 |
| NB | 4076.6667 |
| NFLD | 1496.1111 |
| NS | 5098.3333 |
| ONT | 26621.1111 |
| PEI | 938.8889 |
| QUE | 8631.6667 |
| SASK | 4003.3333 |
Agora suponha que queiramos obter a média de todas as variáveis do data frame. Para isso, devemos usar a função mutate_all.
dados %>% mutate_all(mean)
Agora suponha que queiramos obter a média e o desvio padrão de duas variáveis do data frame. Para isso, devemos usar a função mutate_at.
dados %>% mutate_at(vars(migrants, distance), funs(mean, sd))
Para selecionar apenas as linhas com uma determinada característica, usamos a função filter.
Para exemplificar, suponha que queiramos deixar no banco de dados apenas as províncias de destino com mais de um milhão de habitantes em 1971.
df <- dados %>% filter(popd71>1000000)
head(df)
# Busque como se faz para filtrar linhas usando múltiplos filtros
| source | destination | migrants | distance | pops66 | pops71 | popd66 | popd71 | pop_adicional | taxa_cres6671 | |
|---|---|---|---|---|---|---|---|---|---|---|
| <fct> | <fct> | <int> | <int> | <int> | <int> | <int> | <int> | <int> | <dbl> | |
| 1 | NFLD | QUE | 2235 | 1641 | 493396 | 522104 | 5780845 | 6027764 | 246919 | 0.04271331 |
| 2 | PEI | QUE | 635 | 774 | 108535 | 111641 | 5780845 | 6027764 | 246919 | 0.04271331 |
| 3 | NS | QUE | 4350 | 832 | 756039 | 788960 | 5780845 | 6027764 | 246919 | 0.04271331 |
| 4 | NB | QUE | 7905 | 522 | 616788 | 534557 | 5780845 | 6027764 | 246919 | 0.04271331 |
| 5 | ONT | QUE | 48370 | 355 | 6960870 | 7703106 | 5780845 | 6027764 | 246919 | 0.04271331 |
| 6 | MAN | QUE | 4630 | 1519 | 963066 | 988247 | 5780845 | 6027764 | 246919 | 0.04271331 |
A função select do pacote dplyr permite que o usuário selecione apenas as colunas desejadas no data frame.
df <- dados %>% select(source, destination, migrants)
head(df)
| source | destination | migrants | |
|---|---|---|---|
| <fct> | <fct> | <int> | |
| 1 | PEI | NFLD | 255 |
| 2 | NS | NFLD | 2380 |
| 3 | NB | NFLD | 1140 |
| 4 | QUE | NFLD | 2145 |
| 5 | ONT | NFLD | 6295 |
| 6 | MAN | NFLD | 215 |
df <- dados %>% select(-source, -destination, -migrants)
head(df)
| distance | pops66 | pops71 | popd66 | popd71 | pop_adicional | taxa_cres6671 | |
|---|---|---|---|---|---|---|---|
| <int> | <int> | <int> | <int> | <int> | <int> | <dbl> | |
| 1 | 924 | 108535 | 111641 | 493396 | 522104 | 28708 | 0.0581845 |
| 2 | 952 | 756039 | 788960 | 493396 | 522104 | 28708 | 0.0581845 |
| 3 | 1119 | 616788 | 534557 | 493396 | 522104 | 28708 | 0.0581845 |
| 4 | 1641 | 5780845 | 6027764 | 493396 | 522104 | 28708 | 0.0581845 |
| 5 | 1996 | 6960870 | 7703106 | 493396 | 522104 | 28708 | 0.0581845 |
| 6 | 3159 | 963066 | 988247 | 493396 | 522104 | 28708 | 0.0581845 |
O dplyr disponibiliza uma série de possibilidades para a realização de joins entre data frames.
library("IRdisplay")
display_png(file="joins.png", width = 500)
Para demonstrar, vamos criar duas bases de dados aleatórias com um código de identificação de nome id.
df1 = data.frame(id = 1:10, v1 = rnorm(10, 5, 2))
df2 = data.frame(id = 12:1, v2 = rnorm(12, 30, 60))
anti_join(df1, df2, by = "id")
| id | v1 |
|---|---|
| <int> | <dbl> |
anti_join(df2, df1, by = "id")
| id | v2 |
|---|---|
| <int> | <dbl> |
| 11 | 18.276553 |
| 11 | 66.688847 |
| 11 | 60.117731 |
| 11 | 95.979119 |
| 11 | 106.518942 |
| 11 | -2.430858 |
left_join(df1, df2, by="id")
| id | v1 | v2 |
|---|---|---|
| <int> | <dbl> | <dbl> |
| 1 | 3.574696 | 1.975438 |
| 2 | 5.813891 | 104.307472 |
| 3 | 3.472300 | 5.973093 |
| 4 | 4.799532 | 28.676813 |
| 5 | 5.875725 | 20.363682 |
| 6 | 2.454227 | 70.102221 |
| 7 | 8.153396 | -28.248187 |
| 8 | 2.957694 | 3.062915 |
| 9 | 3.135772 | 58.519653 |
| 10 | 3.229637 | 1.169175 |
right_join(df1, df2, by="id")
| id | v1 | v2 |
|---|---|---|
| <int> | <dbl> | <dbl> |
| 1 | 3.574696 | 1.975438 |
| 2 | 5.813891 | 104.307472 |
| 3 | 3.472300 | 5.973093 |
| 4 | 4.799532 | 28.676813 |
| 5 | 5.875725 | 20.363682 |
| 6 | 2.454227 | 70.102221 |
| 7 | 8.153396 | -28.248187 |
| 8 | 2.957694 | 3.062915 |
| 9 | 3.135772 | 58.519653 |
| 10 | 3.229637 | 1.169175 |
| 12 | NA | 35.219557 |
| 11 | NA | -10.637633 |
inner_join(df1, df2, by="id")
| id | v1 | v2 |
|---|---|---|
| <int> | <dbl> | <dbl> |
| 1 | 3.574696 | 1.975438 |
| 2 | 5.813891 | 104.307472 |
| 3 | 3.472300 | 5.973093 |
| 4 | 4.799532 | 28.676813 |
| 5 | 5.875725 | 20.363682 |
| 6 | 2.454227 | 70.102221 |
| 7 | 8.153396 | -28.248187 |
| 8 | 2.957694 | 3.062915 |
| 9 | 3.135772 | 58.519653 |
| 10 | 3.229637 | 1.169175 |
full_join(df1, df2, by="id")
| id | v1 | v2 |
|---|---|---|
| <int> | <dbl> | <dbl> |
| 1 | 3.574696 | 1.975438 |
| 2 | 5.813891 | 104.307472 |
| 3 | 3.472300 | 5.973093 |
| 4 | 4.799532 | 28.676813 |
| 5 | 5.875725 | 20.363682 |
| 6 | 2.454227 | 70.102221 |
| 7 | 8.153396 | -28.248187 |
| 8 | 2.957694 | 3.062915 |
| 9 | 3.135772 | 58.519653 |
| 10 | 3.229637 | 1.169175 |
| 12 | NA | 35.219557 |
| 11 | NA | -10.637633 |
Para empilhar dados em um data frame, podemos usar a função gather do pacote tidyr. Para demonstrar, considere o seguinte data frame:
df <- data.frame(id = 1:10, jan2020 = rnorm(10, 0, 1), fev2020 = rnorm(10, 0, 2),
mar2020 = rnorm(10, 0, 3), abr2020 = rnorm(10, 0, 5), mai2020 = rnorm(10, 0, 4))
df
| id | jan2020 | fev2020 | mar2020 | abr2020 | mai2020 |
|---|---|---|---|---|---|
| <int> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> |
| 1 | -0.08277323 | -2.1718590 | -0.94048497 | -7.4472086 | -1.3829227 |
| 2 | 1.45867798 | -0.3052334 | 0.10163275 | -3.0015791 | -1.6148980 |
| 3 | 0.28553012 | -1.0609741 | 3.15229679 | -2.5873120 | 0.2860221 |
| 4 | -0.27852107 | -1.8480766 | -5.47286971 | 1.9369888 | 6.3592236 |
| 5 | -1.97121451 | -1.5741564 | 0.08671564 | -1.7674630 | -7.0492033 |
| 6 | -1.25081949 | -1.2157476 | 2.33573842 | 0.6363541 | 4.0112713 |
| 7 | -0.07142108 | 1.6564270 | -1.37549967 | -7.8345583 | -0.8714148 |
| 8 | 1.69428070 | -2.3569023 | -0.08916385 | 1.8508725 | 3.4302762 |
| 9 | 0.01790343 | 1.3479317 | 1.42258395 | -0.9896906 | 1.5845378 |
| 10 | -2.07003825 | 1.5775203 | -0.83038955 | -2.8511987 | 4.1839738 |
df1 <- gather(df, key = "tempo", value = "nova_variavel", -id)
head(df1)
| id | tempo | nova_variavel | |
|---|---|---|---|
| <int> | <chr> | <dbl> | |
| 1 | 1 | jan2020 | -0.08277323 |
| 2 | 2 | jan2020 | 1.45867798 |
| 3 | 3 | jan2020 | 0.28553012 |
| 4 | 4 | jan2020 | -0.27852107 |
| 5 | 5 | jan2020 | -1.97121451 |
| 6 | 6 | jan2020 | -1.25081949 |
Para transformar dados empilhados em planilhas de estilo cross-section, podemos usar a função spread do pacote tidyr.
df2 <- spread(df1, tempo, -id)
head(df2)
| id | abr2020 | fev2020 | jan2020 | mai2020 | mar2020 | |
|---|---|---|---|---|---|---|
| <int> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | |
| 1 | 1 | -7.4472086 | -2.1718590 | -0.08277323 | -1.3829227 | -0.94048497 |
| 2 | 2 | -3.0015791 | -0.3052334 | 1.45867798 | -1.6148980 | 0.10163275 |
| 3 | 3 | -2.5873120 | -1.0609741 | 0.28553012 | 0.2860221 | 3.15229679 |
| 4 | 4 | 1.9369888 | -1.8480766 | -0.27852107 | 6.3592236 | -5.47286971 |
| 5 | 5 | -1.7674630 | -1.5741564 | -1.97121451 | -7.0492033 | 0.08671564 |
| 6 | 6 | 0.6363541 | -1.2157476 | -1.25081949 | 4.0112713 | 2.33573842 |
Suponha que tenhamos uma variável em que todas as observações sejam compostas por caracteres com um separador comum. Podemos separar as duas partes desta variável que estão separadas por um caractere comum. Para tanto, podemos usar a função separate do pacote tidyr.
Para demonstrar, suponha que tenhamos uma coluna com as capitais estaduais da região Nordeste e a sigla do seu respectivo estado separados por um ífem. Podemos gerar uma coluna com o nome da capital e outra coluna com a sigla do estado.
df = data.frame(v1 = c("São Luis-MA", "Teresina", "Fortaleza-CE", "Natal-RN", "João Pessoa-PB",
"Recife-PE", "Maceió-AL", "Aracaju-SE", "Salvador-BA"), CODUF = 21:29)
df
| v1 | CODUF |
|---|---|
| <fct> | <int> |
| São Luis-MA | 21 |
| Teresina | 22 |
| Fortaleza-CE | 23 |
| Natal-RN | 24 |
| João Pessoa-PB | 25 |
| Recife-PE | 26 |
| Maceió-AL | 27 |
| Aracaju-SE | 28 |
| Salvador-BA | 29 |
df <- df %>% separate(v1, into = c("Capital", "Estado"), sep = "-")
df
Warning message: “Expected 2 pieces. Missing pieces filled with `NA` in 1 rows [2].”
| Capital | Estado | CODUF |
|---|---|---|
| <chr> | <chr> | <int> |
| São Luis | MA | 21 |
| Teresina | NA | 22 |
| Fortaleza | CE | 23 |
| Natal | RN | 24 |
| João Pessoa | PB | 25 |
| Recife | PE | 26 |
| Maceió | AL | 27 |
| Aracaju | SE | 28 |
| Salvador | BA | 29 |
Lubridate é um pacote dedicado à manipulação de dados com a classe date. O pacote dispões de várias funções que permitem que ousuário opere do variáveis nos formatos de data e horas.
#instale o pacote
install.packages("lubridate")
library(lubridate)
Attaching package: ‘lubridate’
The following objects are masked from ‘package:base’:
date, intersect, setdiff, union
Para indicar ao R que um determinado objeto é uma data, use a função as_date.
data <- "20/10/2020"
data <- as_date(data)
class(data)
Warning message: “All formats failed to parse. No formats found.”
O lubridate permite que o usuário declare que as datas seguem os seguintes formatos:
Dia-mês-ano $\Rightarrow$ dmy()
Mês-dia-ano $\Rightarrow$ mdy()
Mês-ano-dia $\Rightarrow$ myd()
Ano-mês-dia $\Rightarrow$ ymd()
Ano-dia-mês $\Rightarrow$ ydm()
dmy("22051991")
dmy("22/05/1991")
Caso seja necessário incluir as horas nas datas, o usuário pode utilizar as seguintes funções:
dia-mês-ano-hora $\Rightarrow$ dmy_h()
dia-mês-ano-hora-minuto $\Rightarrow$ dmy_hm()
As demais especificações seguem a mesma lógica
dmy_hms("22/05/1991-20:35:00")
[1] "1991-05-22 20:35:00 UTC"
Caso o usuário deseje extrair um componente específico de uma data, ele pode usar as seguintes funções:
second(dmy_hms("22/05/1991-20:35:00"))
mday(dmy_hms("22/05/1991-20:35:00"))
month(dmy_hms("22/05/1991-20:35:00"))
Para verificar a data corrente use a função today()
today()
Para checar a data e o horario correntes use a função now().
now()
[1] "2020-10-10 18:40:47 -03"
É possível checar a quantidade de tempo em um determinado intervalo de tempo
int <-dmy("01-01-2020") %--% dmy("31-10-2020")
int/ddays() # checando a quantidade de dias no intervalo de tempo
int/dminutes() # checando a quantidade de minutos no intervalo de tempo
int/dhours() # checando a quantidade de horas no intervalo de tempo
int/seconds() # checando a quantidade de segundos no intervalo de tempo
stringr é uma biblioteca voltada para a manipulação de dados do tipo string em R. A biblioteca é ideal para a extração de informações em arquivos de texto. Informações sobre a biblioteca podem ser obtidas em:
https://github.com/tidyverse/stringr
https://cran.r-project.org/web/packages/stringr/stringr.pdf
Este breve documento busca demonstrar as funcionalidades básicas acerca da biblioteca stringr.
# Instalando a biblioteca
install.packages("stringr")
# Liberando a biblioteca
library(stringr)
OBS: Todas as funções do stringr começam com o prefixo str. Isso ajuda na hora de encontrar a função que você está procurando. No RStudio, digite str e aperte TAB para visualizar a lista de funções com esse prefixo.
Para isto, podemos usar a função str_length(). Esta função recebe como argumento um vetor de strings e retorna o número de caracteres de cada string.
str_length("Programa de Pós-Graduação em Economia Rural")
Para este tipo de problema, podemos usar a função str_to_upper().
str_to_upper("Programa de Pós-Graduação em Economia Rural")
Para este tipo de problema, podemos usar a função str_to_lower().
str_to_lower("Programa de Pós-Graduação em Economia Rural")
Muitas vezes os dados de texto possuem algumas falhas de digitações onde temos espaços adicionais na escrita. Para remover esses espaços, podemos usar a função str_trim().
str_trim("Programa de Pós-Graduação em Economia Rural ")
Muitas vezes as informações vêm com um caracter adicional. Para selecionar apenas a parte de interesse, podemos usar a função str_sub.
s <- c("01-Feminino", "02-Masculino", "03-Indefinido")
str_sub(s, start = 4) # obter do quarto até o último caractere
# Imagine que você precisa extrair apenas os dois últimos caracteres de uma string
str_sub(c("Fortaleza-CE", "Natal-RN", "Recife-PE"))
# Em outros casos, o usuário pode querer obter apenas os caracteres em uma posição específica da string
str_sub("--CE--", 3, 4)
Muitas vezes precisamos unir duas variáveis strings para formar uma única variável. Para isso, podemos usar a função str_c().
str_c("Fortaleza", "-", "CE")
Muitas vezes precisamos identificar se uma determinada palavra é mencionada em uma string. No R isso pode ser feito utilizando a função str_detect. A função retorna TRUE caso o caractere buscado seja encontrado e FALSE caso contrário.
str_detect("Programa de Pós-Graduação em Economia Rural", pattern = "Rural")
str_detect("Programa de Pós-Graduação em Economia Rural", pattern = "^Rural")
# reconhece apenas o que começa exatamente em "Rural"
str_detect("Programa de Pós-Graduação em Economia Rural", pattern = "Economia?Rural")
# reconhece tudo que tenha “Economia Rural”, com ou sem espaço antes entre o "a" e o "R"
str_detect("Programa de Pós-Graduação em Economia Rural", pattern = "Rural$")
# reconhece apenas o que termina exatamente em "Rural"
Algumas vezes nos deparamos com ocasiões em que precisamos substituir uma determinada palavra por outra em um bamco de dados. Este problema pode ser resolvido com a função str_replace().
capitais <- c("São Luis-MA", "Teresina-PI", "Fortaleza-PE")
str_replace(capitais, "Fortaleza-PE","Fortaleza-CE")
string <- "Hoje o dia está ensolarado. Porám, não irei para a praia."
str_split(string, fixed('.'))
strings <- c("Capital do Ceará", "Capital de Pernambuco", "Distrito Federal")
str_subset(strings, 'Capital')
Suponha que você irá avaliar uma política pública que fornece assistência técnica aos produtores rurais. Para facilitar a exposição, suponha que a sua amostra só possui cinco produtores. Seu banco de dados tem as seguintes propriedades:
dados <- data.frame(produtor = c("José Luis da Silva", "Maria da conceição Oliveira", "Antonio Gomes Pereira ", "Luzia da Silva Gomes", "Joana Silva Pereira"), municipio = c("feira de santana - BA", "alto santo - CE", "patos - PB", "picos - PI", "arcoverde - PE"), tratamento = rbinom(5, 1, .3), producao = runif(5, .5, 10))
1.1 Corrija os erros de ortografia e separação cometidos pela pessoa que tabulou a coluna produtor.
1.2 Corrija os erros de ortografia da variável município para que os nomes sejam escritos todos com iniciais maiúsculas.
1.3 Crie uma coluna adicional com o nome "UF", contendo a sigla do estado de cada município.
A biblioteca lubridate disponibiliza uma base de dados sobre as partidas disputadas pelo time de basquete Los Angeles Lakers entre os anos de 2008 e 2009. Para importá-la para o seu ambiente de trabalho use dados <- lubridate::lakers. Cada partida é dividida em cinco períodos com 12 minutos de duração cada, que são indicados pela coluna period. A coluna etype indica o tipo de lance acontecido em um determinado tempo da partida, que por sua vez é indicado pela coluna time e a coluna points indica quantos pontos foram realizados em cada lance. Na coluna team estão expostas as siglas dos times, sendo "LAL" a sigla dos Los Angeles Lakers.
2.1 Use as funções da biblioteca lubridate para mostrar a média de tempo necessária para o Los Angeles Lakers marcar o primeiro ponto.
2.2 Mostre quantos pontos cada jogador do Lakers marcou entre 2008 e 2009, apresentando o resultado por ano.
2.3 Quem foi o artilheiro do Los Angeles Lakers em 2008? E em 2009?
2.4 Em média, quantos lances livres (free throw) o Los Angeles Lakers realiza por partida?
Usando o data frame disponibilizado a seguir, crie um data frame com as estatísticas descritivas (contendo as colunas indicando - nome das variáveis, número de observações,valor médio, desvio padrão, valor mínimo e valor máximo - nesta mesma ordem de apresentação) para cada uma das variáveis da tabela.
set.seed(200)
dados <- data.frame(V1 = rnorm(100, .7, .3), V2 = runif(100, 50, 5000), V3 = rbinom(100, 1, .45), V4 = as.factor(c(rep("M", 50), rep("F", 50))), V5 = rbeta(100, .5, .3, 0))
NOTA: Na construção da tabela, use um único comando sequenciando as linhas de comando com a função pip. A organização da posição das colunas pode ser feita em outra sequência de comandos