A linguagem de programação R é versátil e pode ser usada para manipulação, análise, raspagem, visualização de dados, entre outros.
Esta oficina foca no uso prática de consumo e análise de dados com foco na base de dados de pensionistas. O objetivo é o(a) aluno(a) sair do curso já sabendo trabalhar dados disponíveis na internet.
Isso inclui desde fazer o download do dado até fazer tratamentos e análises que permitam responder a perguntas típicas de um ambiente de jornalismo.
Para esta oficina, vamos usar os dados de pensionistas do governo federal. A base de dados foi disponibilizada pelo Ministério da Economia após uma vitória do ‘Fiquem sabendo’.
Os arquivos são disponibilizados por mês no portal dados.gov.br em formato CSV. Também há um dicionário de dados em formato PDF.
Para esta análise, vamos usar o arquivo mais recente, de julho de 2020. Para baixar os arquivos, acesse o link, localize o arquivo, clique em “Explorar” e depois em “Ir para recurso”.
É preciso instalar alguns pacotes caso esta seja a primeira vez que você mexa com R no seu computador.
Para isso, nós vamos usar a função install.packages()
. Dentro dos parêntesis, devemos informar o nome do pacote.
# install.packages("tidyverse")
# install.packages("data.table")
# install.packages("abjutils")
Precisamos também carregar os pacotes que serão usados. Usamos a função library()
e informarmos o nome do pacote dentro dos parêntesis.
library(tidyverse)
library(data.table)
library(abjutils)
Há diversas formas de importar um arquivo para o RStudio. Uma das formas mais simples é:
- Clique em “File”
- Clique em “Import Dataset”
- Clique em “From text (base)”
- Selecione o arquivo
- Cheque se tudo parece correto
- Clique em “Import”
Agora, vamos importar o arquivo apenas informar onde ele está e qual é o nome dele. Neste caso, optamos por usar a função fread()
do pacote data.table
.
# df_pensionistas_07_2020 <- fread("data/PENSIONISTAS_072020.csv")
df_pensionistas_07_2020 <- readRDS("data/julho2020.rds")
Se quisermos, podemos tambem informar ainda:
- a codificação do arquivo (encoding)
- o separador das colunas (sep)
- o número de linhas que queremos ler (nrows)
- quais colunas queremos ler (colnames)
- quais colunas não queremos ler (drop)
- outros
Uma das dificuldades na importação de arquivo é descobrir a pasta. Podemos usar as funções getwd()
, setwd()
e list.files()
para nos ajudar.
getwd()
## [1] "/Users/gabrielacaesar/Downloads/oficina-R-master"
# setwd("~/Downloads")
list.files()
## [1] "LICENSE" "README.md" "aula.Rmd" "aula.html"
## [5] "data" "image" "index.html" "oficina-R.Rproj"
O arquivo já foi importado e agora queremos dar uma olhada nele. Usaremos as funções summary()
, glimpse()
e View()
.
summary(df_pensionistas_07_2020)
## NOME DO SERVIDOR INSTITUIDOR CPF SERVIDOR INSTITUIDOR
## Length:295468 Length:295468
## Class :character Class :character
## Mode :character Mode :character
##
##
##
## DATA NASCIMENTO INSTITUIDOR DATA FALECIMENTO INSTITUIDOR
## Length:295468 Length:295468
## Class :character Class :character
## Mode :character Mode :character
##
##
##
## MATRICULA SERVIDOR INSTITUIDOR NOME DO ORGAO SIGLA DO ORGAO
## Min. :1.300e+11 Length:295468 Length:295468
## 1st Qu.:2.500e+11 Class :character Class :character
## Median :3.621e+11 Mode :character Mode :character
## Mean :3.326e+11
## 3rd Qu.:4.081e+11
## Max. :7.000e+11
## CODIGO ORGAO SUPERIOR CARGO SERVIDOR INSTITUIDOR NIVEL ESCOLARIDADE CARGO
## Min. : 0 Length:295468 Length:295468
## 1st Qu.: 0 Class :character Class :character
## Median :17000 Mode :character Mode :character
## Mean :15313
## 3rd Qu.:17000
## Max. :55000
## CLASSE SERVIDOR INSTITUIDOR PADRAO SERVIDOR INSTITUIDOR
## Length:295468 Length:295468
## Class :character Class :character
## Mode :character Mode :character
##
##
##
## REFERENCIA SERVIDOR INSTITUIDOR NIVEL SERVIDOR INSTITUIDOR
## Length:295468 Length:295468
## Class :character Class :character
## Mode :character Mode :character
##
##
##
## OCORRENCIA DE INGRESSO NO SERVICO PUBLICO SERVIDOR INSTITUIDOR
## Length:295468
## Class :character
## Mode :character
##
##
##
## DATA DE OCORRENCIA DE INGRESSO NO SERVICO PUBLICO SERVIDOR INSTITUIDOR
## Length:295468
## Class :character
## Mode :character
##
##
##
## NOME DO BENEFICIARIO CPF DO BENEFICIARIO DATA DE NASCIMENTO
## Length:295468 Length:295468 Length:295468
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## UF DA UPAG DE VINCULACAO TIPO DE BENEFICIARIO TIPO PENSAO
## Length:295468 Length:295468 Length:295468
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## NATUREZA PENSAO DATA INICIO DO BENEFICIO DATA FIM DO BENEFICIO
## Length:295468 Length:295468 Length:295468
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## RENDIMENTO BRUTO RENDIMENTO LIQUIDO PAGAMENTO SUSPENSO X29
## Length:295468 Length:295468 Length:295468 Mode:logical
## Class :character Class :character Class :character NA's:295468
## Mode :character Mode :character Mode :character
##
##
##
glimpse(df_pensionistas_07_2020)
## Rows: 295,468
## Columns: 29
## $ `NOME DO SERVIDOR INSTITUIDOR` <chr> …
## $ `CPF SERVIDOR INSTITUIDOR` <chr> …
## $ `DATA NASCIMENTO INSTITUIDOR` <chr> …
## $ `DATA FALECIMENTO INSTITUIDOR` <chr> …
## $ `MATRICULA SERVIDOR INSTITUIDOR` <dbl> …
## $ `NOME DO ORGAO` <chr> …
## $ `SIGLA DO ORGAO` <chr> …
## $ `CODIGO ORGAO SUPERIOR` <dbl> …
## $ `CARGO SERVIDOR INSTITUIDOR` <chr> …
## $ `NIVEL ESCOLARIDADE CARGO` <chr> …
## $ `CLASSE SERVIDOR INSTITUIDOR` <chr> …
## $ `PADRAO SERVIDOR INSTITUIDOR` <chr> …
## $ `REFERENCIA SERVIDOR INSTITUIDOR` <chr> …
## $ `NIVEL SERVIDOR INSTITUIDOR` <chr> …
## $ `OCORRENCIA DE INGRESSO NO SERVICO PUBLICO SERVIDOR INSTITUIDOR` <chr> …
## $ `DATA DE OCORRENCIA DE INGRESSO NO SERVICO PUBLICO SERVIDOR INSTITUIDOR` <chr> …
## $ `NOME DO BENEFICIARIO` <chr> …
## $ `CPF DO BENEFICIARIO` <chr> …
## $ `DATA DE NASCIMENTO` <chr> …
## $ `UF DA UPAG DE VINCULACAO` <chr> …
## $ `TIPO DE BENEFICIARIO` <chr> …
## $ `TIPO PENSAO` <chr> …
## $ `NATUREZA PENSAO` <chr> …
## $ `DATA INICIO DO BENEFICIO` <chr> …
## $ `DATA FIM DO BENEFICIO` <chr> …
## $ `RENDIMENTO BRUTO` <chr> …
## $ `RENDIMENTO LIQUIDO` <chr> …
## $ `PAGAMENTO SUSPENSO` <chr> …
## $ X29 <lgl> …
# View(df_pensionistas_07_2020)
Outras funções úteis para checar o arquivo estão abaixo. São elas: head()
, tail()
, colnames()
, unique()
e length()
.
head(df_pensionistas_07_2020)
## # A tibble: 6 x 29
## `NOME DO SERVID… `CPF SERVIDOR I… `DATA NASCIMENT… `DATA FALECIMEN…
## <chr> <chr> <chr> <chr>
## 1 ADOLFO LEAO DE … ***602951** 12061944 10021998
## 2 AGNELO FERREIRA… ***260401** 14121939 25012016
## 3 ALBERTO FERNAND… ***421424** 08021947 13102012
## 4 ALEXANDRE PEDRO… ***302341** 04111932 20112012
## 5 ALUIZIO DE SOUZ… ***891031** 13031934 21082018
## 6 ALVARO RAIMUNDO… ***818627** 06021918 25042000
## # … with 25 more variables: `MATRICULA SERVIDOR INSTITUIDOR` <dbl>, `NOME DO
## # ORGAO` <chr>, `SIGLA DO ORGAO` <chr>, `CODIGO ORGAO SUPERIOR` <dbl>, `CARGO
## # SERVIDOR INSTITUIDOR` <chr>, `NIVEL ESCOLARIDADE CARGO` <chr>, `CLASSE
## # SERVIDOR INSTITUIDOR` <chr>, `PADRAO SERVIDOR INSTITUIDOR` <chr>,
## # `REFERENCIA SERVIDOR INSTITUIDOR` <chr>, `NIVEL SERVIDOR
## # INSTITUIDOR` <chr>, `OCORRENCIA DE INGRESSO NO SERVICO PUBLICO SERVIDOR
## # INSTITUIDOR` <chr>, `DATA DE OCORRENCIA DE INGRESSO NO SERVICO PUBLICO
## # SERVIDOR INSTITUIDOR` <chr>, `NOME DO BENEFICIARIO` <chr>, `CPF DO
## # BENEFICIARIO` <chr>, `DATA DE NASCIMENTO` <chr>, `UF DA UPAG DE
## # VINCULACAO` <chr>, `TIPO DE BENEFICIARIO` <chr>, `TIPO PENSAO` <chr>,
## # `NATUREZA PENSAO` <chr>, `DATA INICIO DO BENEFICIO` <chr>, `DATA FIM DO
## # BENEFICIO` <chr>, `RENDIMENTO BRUTO` <chr>, `RENDIMENTO LIQUIDO` <chr>,
## # `PAGAMENTO SUSPENSO` <chr>, X29 <lgl>
head(df_pensionistas_07_2020, 15)
## # A tibble: 15 x 29
## `NOME DO SERVID… `CPF SERVIDOR I… `DATA NASCIMENT… `DATA FALECIMEN…
## <chr> <chr> <chr> <chr>
## 1 ADOLFO LEAO DE … ***602951** 12061944 10021998
## 2 AGNELO FERREIRA… ***260401** 14121939 25012016
## 3 ALBERTO FERNAND… ***421424** 08021947 13102012
## 4 ALEXANDRE PEDRO… ***302341** 04111932 20112012
## 5 ALUIZIO DE SOUZ… ***891031** 13031934 21082018
## 6 ALVARO RAIMUNDO… ***818627** 06021918 25042000
## 7 AMERICO JORGE ***397527** 22071929 22072018
## 8 ANGELO PEREIRA … ***081931** 24051941 02072017
## 9 ANGELO PEREIRA … ***081931** 24051941 02072017
## 10 ANGELO PEREIRA … ***081931** 24051941 02072017
## 11 ANGELO PEREIRA … ***081931** 24051941 02072017
## 12 ARNALDO LEANDRO ***518767** 20081922 06082019
## 13 ARTHUR NATIVIDA… ***455941** 07081915 16122010
## 14 AUREA JULIA MOR… ***217291** 10091940 28052008
## 15 BENEDITO DIAS L… ***551781** 08091938 08022001
## # … with 25 more variables: `MATRICULA SERVIDOR INSTITUIDOR` <dbl>, `NOME DO
## # ORGAO` <chr>, `SIGLA DO ORGAO` <chr>, `CODIGO ORGAO SUPERIOR` <dbl>, `CARGO
## # SERVIDOR INSTITUIDOR` <chr>, `NIVEL ESCOLARIDADE CARGO` <chr>, `CLASSE
## # SERVIDOR INSTITUIDOR` <chr>, `PADRAO SERVIDOR INSTITUIDOR` <chr>,
## # `REFERENCIA SERVIDOR INSTITUIDOR` <chr>, `NIVEL SERVIDOR
## # INSTITUIDOR` <chr>, `OCORRENCIA DE INGRESSO NO SERVICO PUBLICO SERVIDOR
## # INSTITUIDOR` <chr>, `DATA DE OCORRENCIA DE INGRESSO NO SERVICO PUBLICO
## # SERVIDOR INSTITUIDOR` <chr>, `NOME DO BENEFICIARIO` <chr>, `CPF DO
## # BENEFICIARIO` <chr>, `DATA DE NASCIMENTO` <chr>, `UF DA UPAG DE
## # VINCULACAO` <chr>, `TIPO DE BENEFICIARIO` <chr>, `TIPO PENSAO` <chr>,
## # `NATUREZA PENSAO` <chr>, `DATA INICIO DO BENEFICIO` <chr>, `DATA FIM DO
## # BENEFICIO` <chr>, `RENDIMENTO BRUTO` <chr>, `RENDIMENTO LIQUIDO` <chr>,
## # `PAGAMENTO SUSPENSO` <chr>, X29 <lgl>
tail(df_pensionistas_07_2020)
## # A tibble: 6 x 29
## `NOME DO SERVID… `CPF SERVIDOR I… `DATA NASCIMENT… `DATA FALECIMEN…
## <chr> <chr> <chr> <chr>
## 1 ANTONIO PRAZERE… ***522842** 11041927 22012013
## 2 ROBERTO SOARES … ***515507** 01051929 03072012
## 3 JOSE ESTEVES DE… 00000000000 10031921 15071986
## 4 MANOEL WALDEMIR… ***350907** 11021914 27051989
## 5 MANOEL WALDEMIR… ***350907** 11021914 27051989
## 6 MANOEL WALDEMIR… ***350907** 11021914 27051989
## # … with 25 more variables: `MATRICULA SERVIDOR INSTITUIDOR` <dbl>, `NOME DO
## # ORGAO` <chr>, `SIGLA DO ORGAO` <chr>, `CODIGO ORGAO SUPERIOR` <dbl>, `CARGO
## # SERVIDOR INSTITUIDOR` <chr>, `NIVEL ESCOLARIDADE CARGO` <chr>, `CLASSE
## # SERVIDOR INSTITUIDOR` <chr>, `PADRAO SERVIDOR INSTITUIDOR` <chr>,
## # `REFERENCIA SERVIDOR INSTITUIDOR` <chr>, `NIVEL SERVIDOR
## # INSTITUIDOR` <chr>, `OCORRENCIA DE INGRESSO NO SERVICO PUBLICO SERVIDOR
## # INSTITUIDOR` <chr>, `DATA DE OCORRENCIA DE INGRESSO NO SERVICO PUBLICO
## # SERVIDOR INSTITUIDOR` <chr>, `NOME DO BENEFICIARIO` <chr>, `CPF DO
## # BENEFICIARIO` <chr>, `DATA DE NASCIMENTO` <chr>, `UF DA UPAG DE
## # VINCULACAO` <chr>, `TIPO DE BENEFICIARIO` <chr>, `TIPO PENSAO` <chr>,
## # `NATUREZA PENSAO` <chr>, `DATA INICIO DO BENEFICIO` <chr>, `DATA FIM DO
## # BENEFICIO` <chr>, `RENDIMENTO BRUTO` <chr>, `RENDIMENTO LIQUIDO` <chr>,
## # `PAGAMENTO SUSPENSO` <chr>, X29 <lgl>
tail(df_pensionistas_07_2020, 14)
## # A tibble: 14 x 29
## `NOME DO SERVID… `CPF SERVIDOR I… `DATA NASCIMENT… `DATA FALECIMEN…
## <chr> <chr> <chr> <chr>
## 1 ADELSON PEREIRA… ***970657** 14091909 27091976
## 2 JORGE MOURA 00000000000 29041915 13011949
## 3 JORGE MOURA 00000000000 29041915 13011949
## 4 JORGE ALVES RIB… ***508047** 12051935 24091976
## 5 JORGE ALVES RIB… ***508047** 12051935 24091976
## 6 ANTONIO DE PADU… ***751932** 08051929 09072012
## 7 ANTONIO PRAZERE… ***522842** 11041927 22012013
## 8 ANTONIO PRAZERE… ***522842** 11041927 22012013
## 9 ANTONIO PRAZERE… ***522842** 11041927 22012013
## 10 ROBERTO SOARES … ***515507** 01051929 03072012
## 11 JOSE ESTEVES DE… 00000000000 10031921 15071986
## 12 MANOEL WALDEMIR… ***350907** 11021914 27051989
## 13 MANOEL WALDEMIR… ***350907** 11021914 27051989
## 14 MANOEL WALDEMIR… ***350907** 11021914 27051989
## # … with 25 more variables: `MATRICULA SERVIDOR INSTITUIDOR` <dbl>, `NOME DO
## # ORGAO` <chr>, `SIGLA DO ORGAO` <chr>, `CODIGO ORGAO SUPERIOR` <dbl>, `CARGO
## # SERVIDOR INSTITUIDOR` <chr>, `NIVEL ESCOLARIDADE CARGO` <chr>, `CLASSE
## # SERVIDOR INSTITUIDOR` <chr>, `PADRAO SERVIDOR INSTITUIDOR` <chr>,
## # `REFERENCIA SERVIDOR INSTITUIDOR` <chr>, `NIVEL SERVIDOR
## # INSTITUIDOR` <chr>, `OCORRENCIA DE INGRESSO NO SERVICO PUBLICO SERVIDOR
## # INSTITUIDOR` <chr>, `DATA DE OCORRENCIA DE INGRESSO NO SERVICO PUBLICO
## # SERVIDOR INSTITUIDOR` <chr>, `NOME DO BENEFICIARIO` <chr>, `CPF DO
## # BENEFICIARIO` <chr>, `DATA DE NASCIMENTO` <chr>, `UF DA UPAG DE
## # VINCULACAO` <chr>, `TIPO DE BENEFICIARIO` <chr>, `TIPO PENSAO` <chr>,
## # `NATUREZA PENSAO` <chr>, `DATA INICIO DO BENEFICIO` <chr>, `DATA FIM DO
## # BENEFICIO` <chr>, `RENDIMENTO BRUTO` <chr>, `RENDIMENTO LIQUIDO` <chr>,
## # `PAGAMENTO SUSPENSO` <chr>, X29 <lgl>
colnames(df_pensionistas_07_2020)
## [1] "NOME DO SERVIDOR INSTITUIDOR"
## [2] "CPF SERVIDOR INSTITUIDOR"
## [3] "DATA NASCIMENTO INSTITUIDOR"
## [4] "DATA FALECIMENTO INSTITUIDOR"
## [5] "MATRICULA SERVIDOR INSTITUIDOR"
## [6] "NOME DO ORGAO"
## [7] "SIGLA DO ORGAO"
## [8] "CODIGO ORGAO SUPERIOR"
## [9] "CARGO SERVIDOR INSTITUIDOR"
## [10] "NIVEL ESCOLARIDADE CARGO"
## [11] "CLASSE SERVIDOR INSTITUIDOR"
## [12] "PADRAO SERVIDOR INSTITUIDOR"
## [13] "REFERENCIA SERVIDOR INSTITUIDOR"
## [14] "NIVEL SERVIDOR INSTITUIDOR"
## [15] "OCORRENCIA DE INGRESSO NO SERVICO PUBLICO SERVIDOR INSTITUIDOR"
## [16] "DATA DE OCORRENCIA DE INGRESSO NO SERVICO PUBLICO SERVIDOR INSTITUIDOR"
## [17] "NOME DO BENEFICIARIO"
## [18] "CPF DO BENEFICIARIO"
## [19] "DATA DE NASCIMENTO"
## [20] "UF DA UPAG DE VINCULACAO"
## [21] "TIPO DE BENEFICIARIO"
## [22] "TIPO PENSAO"
## [23] "NATUREZA PENSAO"
## [24] "DATA INICIO DO BENEFICIO"
## [25] "DATA FIM DO BENEFICIO"
## [26] "RENDIMENTO BRUTO"
## [27] "RENDIMENTO LIQUIDO"
## [28] "PAGAMENTO SUSPENSO"
## [29] "X29"
unique(df_pensionistas_07_2020$`NOME DO ORGAO`)
## [1] "MINIST.DA AGRICULTURA,PECUARIA E ABAST."
## [2] "MINISTERIO DA EDUCACAO"
## [3] "COMANDO DO EXERCITO"
## [4] "FUNDACAO OSORIO"
## [5] "MINISTERIO DA ECONOMIA"
## [6] "MINISTERIO DA JUSTICA E SEGURANCA PUBLIC"
## [7] "AGENCIA BRASILEIRA DE INTELIGENCIA"
## [8] "POLICIA FEDERAL"
## [9] "COMANDO DA AERONAUTICA"
## [10] "CAIXA DE FINANCIAMENTO IMOB.AERONAUTICA"
## [11] "AGENCIA ESPACIAL BRASILEIRA"
## [12] "COMPANHIA NACIONAL DE ABASTECIMENTO"
## [13] "COMPANHIA DESENV. DO VALE SAO FRANCISCO"
## [14] "FUNDACAO NACIONAL DE ARTES"
## [15] "INSTITUTO DO PATR.HIST.E ART. NACIONAL"
## [16] "FUNDACAO BIBLIOTECA NACIONAL"
## [17] "MINISTERIO DA SAUDE"
## [18] "INSTITUTO NACIONAL DE EDUCACAO DE SURDOS"
## [19] "INSTITUTO BENJAMIN CONSTANT"
## [20] "FUNDO NACIONAL DE DESENVOLV. DA EDUCACAO"
## [21] "INST.NACIONAL DE EST.E PESQ.EDUCACIONAIS"
## [22] "COLEGIO PEDRO II"
## [23] "FUND.UNIV.FED.DO VALE DO SAO FRANCISCO"
## [24] "UNIVERSIDADE FEDERAL DE ALAGOAS"
## [25] "UNIVERSIDADE FEDERAL DA BAHIA"
## [26] "UNIVERSIDADE FEDERAL DO CEARA"
## [27] "UNIVERSIDADE FEDERAL DO ESPIRITO SANTO"
## [28] "UNIVERSIDADE FEDERAL DE GOIAS"
## [29] "UNIVERSIDADE FEDERAL FLUMINENSE"
## [30] "UNIVERSIDADE FEDERAL DE JUIZ DE FORA"
## [31] "UNIVERSIDADE FEDERAL DE MINAS GERAIS"
## [32] "UNIVERSIDADE FEDERAL DO PARA"
## [33] "UNIVERSIDADE FEDERAL DA PARAIBA"
## [34] "UNIVERSIDADE FEDERAL DO PARANA"
## [35] "UNIVERSIDADE FEDERAL DE PERNAMBUCO"
## [36] "UNIVERSIDADE FED. DO RIO GRANDE DO NORTE"
## [37] "UNIVERSIDADE FED. DO RIO GRANDE DO SUL"
## [38] "UNIVERSIDADE FEDERAL DO RIO DE JANEIRO"
## [39] "UNIVERSIDADE FEDERAL DE SANTA CATARINA"
## [40] "UNIVERSIDADE FEDERAL DE SANTA MARIA"
## [41] "UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO"
## [42] "UNIV. FEDERAL RURAL DO RIO DE JANEIRO"
## [43] "UNIVERSIDADE FEDERAL DE RORAIMA"
## [44] "FUNDACAO UNIVERSIDADE FED. DO TOCANTINS"
## [45] "UNIVERSIDADE FEDERAL DE CAMPINA GRANDE"
## [46] "UNIVERSIDADE FEDERAL RURAL DA AMAZONIA"
## [47] "UNIVERSIDADE FED.DO TRIANGULO MINEIRO"
## [48] "UNI.FED.VALES DO JEQUITINHONHA E MUCURI"
## [49] "CENTRO FEDERAL DE EDUCACAO TECNOLOGICA -"
## [50] "CENTRO FEDERAL DE EDUCACAO TECNOLOGICA D"
## [51] "UNIVERS. TECNOLOGICA FEDERAL DO PARANA"
## [52] "UNIVERSIDADE FEDERAL DE ALFENAS"
## [53] "UNIVERSIDADE FEDERAL DE ITAJUBA"
## [54] "UNIVERSIDADE FEDERAL DE SAO PAULO"
## [55] "UNIVERSIDADE FEDERAL DE LAVRAS"
## [56] "UNIVERSIDADE FEDERAL RURAL DO SEMI-ARIDO"
## [57] "FUNDACAO UNIVERSIDADE FEDERAL DO PAMPA"
## [58] "UNIVERSIDADE FEDERAL DA INTEGRACAO LATIN"
## [59] "FUNDACAO UNIVERSIDADE FEDERAL DE RONDONI"
## [60] "UNIVERSIDADE FEDERAL DO ESTADO DO RIO DE"
## [61] "FUNDACAO UNIVERSIDADE DO AMAZONAS"
## [62] "FUNDACAO UNIVERSIDADE DE BRASILIA"
## [63] "FUNDACAO UNIVERSIDADE DO MARANHAO"
## [64] "FUNDACAO UNIVERSIDADE FEDERAL DO RIO GRA"
## [65] "FUNDACAO UNIV. FEDERAL DE UBERLANDIA"
## [66] "UNIVERSIDADE FEDERAL DO ACRE"
## [67] "UNIVERSIDADE FEDERAL DE MATO GROSSO"
## [68] "FUNDACAO UNIVERSIDADE FEDERAL DE OURO PR"
## [69] "FUNDACAO UNIVERSIDADE FEDERAL DE PELOTAS"
## [70] "UNIVERSIDADE FEDERAL DO PIAUI"
## [71] "FUNDACAO UNIVERSIDADE FEDERAL DE SAO CAR"
## [72] "FUNDACAO UNIVERSIDADE FEDERAL DE SERGIPE"
## [73] "UNIVERSIDADE FEDERAL DE VICOSA"
## [74] "UNIV. FEDERAL DE MATO GROSSO DO SUL"
## [75] "FUNDACAO UNIVERSIDADE FEDERAL DE CIENCIA"
## [76] "FUNDACAO UNIVERSIDADE FEDERAL DE SAO JOA"
## [77] "FUNDACAO UNVERSIDADE FEDERAL DO AMAPA"
## [78] "FUNDACAO JOAQUIM NABUCO"
## [79] "FUND COORD APERF PESSOAL NIVEL SUPERIOR"
## [80] "FUNDACAO UNIVERSIDADE FEDERAL DA GRANDE"
## [81] "UNIVERSIDADE FEDERAL DO RECONCAVO DA BAH"
## [82] "FUNDACAO UNIVERSIDADE FEDERAL DO ABC"
## [83] "INSTITUTO FEDERAL DO ACRE"
## [84] "INSTITUTO FEDERAL DE ALAGOAS"
## [85] "INSTITUTO FEDERAL DO AMAZONAS"
## [86] "INSTITUTO FEDERAL BAIANO"
## [87] "INSTITUTO FEDERAL DO CEARA"
## [88] "INSTITUTO FEDERAL DO ESPIRITO SANTO"
## [89] "INSTITUTO FEDERAL GOIANO"
## [90] "INSTITUTO FEDERAL DO MARANHAO"
## [91] "INSTITUTO FEDERAL DE MINAS GERAIS"
## [92] "INSTITUTO FED. DO NORTE DE MINAS GERAIS"
## [93] "INSTITUTO FED.DO SUDESTE DE MINAS GERAIS"
## [94] "INSTITUTO FEDERAL DO SUL DE MINAS GERAIS"
## [95] "INSTITUTO FEDERAL DE EDUCACAO, CIENCIA E"
## [96] "INSTITUTO FEDERAL DE MATO GROSSO"
## [97] "INSTITUTO FEDERAL DE MATO GROSSO DO SUL"
## [98] "INSTITUTO FEDERAL DO PARA"
## [99] "INSTITUTO FEDERAL DA PARAIBA"
## [100] "INSTITUTO FEDERAL DE PERNAMBUCO"
## [101] "INSTITUTO FEDERAL DO RIO GRANDE DO SUL"
## [102] "INSTITUTO FEDERAL FARROUPILHA"
## [103] "INSTITUTO FEDERAL DE RONDONIA"
## [104] "INSTITUTO FEDERAL CATARINENSE"
## [105] "INSTITUTO FEDERAL DE SERGIPE"
## [106] "INSTITUTO FEDERAL DO TOCANTINS"
## [107] "INSTITUTO FEDERAL DO AMAPA"
## [108] "INSTITUTO FEDERAL DA BAHIA"
## [109] "INSTITUTO FEDERAL DE BRASILIA"
## [110] "INSTITUTO FEDERAL DE GOIAS"
## [111] "INSTITUTO FEDERAL DO PIAUI"
## [112] "INSTITUTO FEDERAL DO PARANA"
## [113] "INSTITUTO FEDERAL DO RIO DE JANEIRO"
## [114] "INSTITUTO FEDERAL FLUMINENSE"
## [115] "INSTITUTO FEDERAL DO RIO GRANDE DO NORTE"
## [116] "INSTITUTO FEDERAL SUL RIO-GRANDENSE"
## [117] "INSTITUTO FEDERAL DE RORAIMA"
## [118] "INSTITUTO FEDERAL DE SANTA CATARINA"
## [119] "INSTITUTO FEDERAL DE SAO PAULO"
## [120] "UNIVERSIDADE FEDERAL DA FRONTEIRA SUL"
## [121] "UNIVERSIDADE FEDERAL DO OESTE DO PARA"
## [122] "UNIVERSIDADE DA INTEGRACAO INTERNACIONAL"
## [123] "UNIVERSIDADE FEDERAL DO SUL E SUDESTE DO"
## [124] "UNIVERSIDADE FEDERAL DO CARIRI"
## [125] "UNIVERSIDADE FEDERAL DO SUL DA BAHIA"
## [126] "FUNDACAO NACIONAL DO INDIO"
## [127] "INST.NAC.METROLOGIA,NORM.E QUAL.INDL."
## [128] "INSTITUTO NACIONAL DA PROPRIEDADE INDUST"
## [129] "POLICIA RODOVIARIA FEDERAL"
## [130] "MINISTERIO DE MINAS E ENERGIA"
## [131] "AGENCIA NACIONAL DE ENERGIA ELETRICA"
## [132] "AGENCIA NAC PETROLEO GAS NAT BIOCOMBUSTI"
## [133] "AGENCIA NACIONAL DE MINERACAO"
## [134] "MINISTERIO DAS RELACOES EXTERIORES"
## [135] "FUNDACAO ALEXANDRE DE GUSMAO"
## [136] "FUNDACAO OSWALDO CRUZ"
## [137] "FUNDACAO NACIONAL DE SAUDE"
## [138] "AGENCIA NACIONAL DE VIGILANCIA SANITARIA"
## [139] "AGENCIA NACIONAL DE SAUDE SUPLEMENTAR"
## [140] "DEFENSORIA PUBLICA DA UNIAO"
## [141] "AGENCIA NACIONAL DE TRANSPORTES TERRESTR"
## [142] "AGENCIA NAC. DE TRANSPORTES AQUAVIARIOS"
## [143] "DEPARTAMENTO NACIONAL DE INFRAESTRUTURA"
## [144] "MINISTERIO DA DEFESA"
## [145] "ADVOCACIA-GERAL DA UNIAO"
## [146] "MINISTERIO DA CIENCIA, TECNOLOGIA, INOVA"
## [147] "MINISTERIO DO MEIO AMBIENTE"
## [148] "MINISTERIO DO DESENVOLVIMENTO REGIONAL"
## [149] "FUNDACAO ESCOLA NACIONAL DE ADMINISTRACA"
## [150] "COMISSAO NACIONAL DE ENERGIA NUCLEAR"
## [151] "FUNDACAO CASA DE RUI BARBOSA"
## [152] "FUNDACAO CULTURAL PALMARES"
## [153] "CONSELHO NAC.DE DESEN.CIEN.E TECNOLOGICO"
## [154] "SUPERINTENDENCIA ZONA FRANCA DE MANAUS"
## [155] "INSTITUTO BRASILEIRO DO MEIO AMBIENTE E"
## [156] "GOVERNO DO EX-TERRITORIO DO AMAPA"
## [157] "GOVERNO DO EX-TERRITORIO DO ACRE"
## [158] "GOVERNO DO EX-TERRITORIO DE RONDONIA"
## [159] "GOVERNO DO EX-TERRITORIO DE RORAIMA"
## [160] "ANTIGO EST.GUANABARA E DISTRITO FEDERAL"
## [161] "DEP.DE CENTRAL.SERV.DE INATIVOS E PENS."
## [162] "MINISTERIO DAS COMUNICACOES"
## [163] "AGENCIA NACIONAL DE TELECOMUNICACOES"
## [164] "INSTITUTO NAC. DE COLONIZ E REF AGRARIA"
## [165] "DEPTO. NACIONAL DE OBRAS CONTRA AS SECAS"
## [166] "INSTITUTO BRASILEIRO DE MUSEUS"
## [167] "AGENCIA NACIONAL DE AGUAS"
## [168] "INSTITUTO DE PESQ. JARDIM BOTANICO DO RJ"
## [169] "INSTITUTO CHICO MENDES DE CONSERVACAO DA"
## [170] "COMISSAO DE VALORES MOBILIARIOS"
## [171] "FUND. INST. BRASIL. GEOG. E ESTATISTICA"
## [172] "INSTITUTO DE PESQUISA ECONOMICA APLICADA"
## [173] "SUPERINTENDENCIA DE SEGUROS PRIVADOS"
## [174] "MINISTERIO DA INFRAESTRUTURA"
## [175] "AGENCIA NACIONAL DE AVIACAO CIVIL"
## [176] "SUPERINTENDENCIA DO DESENV. DA AMAZONIA"
## [177] "SUPERINTENDENCIA DO DESENV. DO NORDESTE"
## [178] "MINISTERIO DO TURISMO"
## [179] "MINISTERIO DA CIDADANIA"
## [180] "FUND.JORGE DUPRAT FIG. SEG. MED.TRABALHO"
## [181] "INSTITUTO NACIONAL DE SEGURO SOCIAL"
## [182] "CONTROLADORIA-GERAL DA UNIAO"
## [183] "COMANDO DA MARINHA"
length(unique(df_pensionistas_07_2020$`NOME DO ORGAO`))
## [1] 183
length(colnames(df_pensionistas_07_2020))
## [1] 29
A função rename()
nos permite renomear alguma coluna do cabeçalho. Outra função interessante para isso é clean_names()
, do pacote janitor
.
df_pensionistas_07_2020_novo <- df_pensionistas_07_2020 %>%
rename("servidor_instituidor" = "NOME DO SERVIDOR INSTITUIDOR")
df_pensionistas_07_2020_novo <- df_pensionistas_07_2020 %>%
janitor::clean_names()
As funções toupper()
e tolower()
colocam o texto em letra maiúscula e minúscula.
A função rm_accent()
do pacote abjutils
elimina o acento do texto.
A função str_trim()
elimina espaços excedentes antes e depois do texto.
A função distinct()
ajuda a eliminar e identificar duplicatas.
As funções separate()
e unite()
separam e unem colunas com base no separador indicado.
As funções pivot_longer()
e pivot_wider()
reorganizam a estrutura de linhas e colunas.
O uso da linguagem de programação R permite uma grande diversidade de análises e descobertas. Muitas delas podem envolver uma elevada complexidade matemática ou de recursos computacionais.
É necessário destacar, no entanto, que no começo de tudo há a necessidade de se conhecer o melhor possível o dado que se tem em mão. Aí é comum o uso de operações de estatística descritiva como mínimo valor, máximo valor, média e mediana, por exemplo.
Observa-se ainda que mesmo para essas operações mais simples é muito frequente a necessiddade de se fazer alguns ajustes para que os dados possam ser corretamente utilizados. Nessa seção vamos fazer alguns exercícios de ajuste do dado e em seguida vamos usar alguns roteiros para caracterização básica dos dados de pensionsitas.
É importante saber se o dado que estamos utilizando está num formato que se encaixa para o tipo de operações que desejamos efetuar. Uma das situações mais frequentes que enfrentamos é quando os valores numéricos não são imediatamente reconhecidos pelo R.
Isso ocorre quando fazemos importações de dados e elementos como vírgula e ponto que são interpretados pelo R como parte de um texto e não de um número. Isso faz com que o dado não possa ser usado em operações aritméticas simples como soma, por exemplo.
Veja abaixo as seis primeiras informações de rendimento bruto e rendimento líquido da tabela com os dados de pensionistas de julho de 2020.
#a função head traz informações relacionadas às seis primeiras linhas de uma tabela
#o símbolo pipe %>% indica ao r que desejamos fazer alguma operação sobre a tabela.
#nesse caso a operação que desejamos fazer é a seleção das colunas Rendimento Bruto e Rendimento Líquido
head(df_pensionistas_07_2020 %>%
select(`RENDIMENTO BRUTO`, `RENDIMENTO LIQUIDO`))
## # A tibble: 6 x 2
## `RENDIMENTO BRUTO` `RENDIMENTO LIQUIDO`
## <chr> <chr>
## 1 1.924,95 1.857,90
## 2 4.046,19 4.046,19
## 3 30.305,13 24.518,19
## 4 5.414,89 5.414,89
## 5 25.155,49 20.723,33
## 6 19.105,33 14.866,84
Observe que o resultado do bloco de código anterior é uma tabela de seis linhas com duas colunas. Veja que ambas colunas estão marcadas como chr. Isso indica que o tipo de ambas colunas é texto e não numérico. Essa característica impede fazer operações aritméticas simples, tais como soma. Se tentarmos fazer a operação abaixo…
# tentativa de somar os rendimentos brutos
# sum(df_pensionistas_07_2020$`RENDIMENTO BRUTO`)
… vamos receber a seguinte mensagem de erro gerada pelo R
O R não permitiu fazer soma dos valores de uma coluna numérica. Precisamos então tratar essas duas colunas. Primeiramente precisamos retirar os pontos e vírgulas para deixar num formato que seja possível indicar ao R que as duas colunas são numéricas. Veja abaixo:
#install.packages("stringr")
library(stringr) # a função str_remove_all está na library stringr
#a função mutate permite fazer alterações nos valores das colunas de uma tabela.
#Nesse caso a função mutate vai fazer alterações nos valores da coluna `RENDIMENTOS BRUTO`
#a função str_remove_all exclui partes de texto.
#Nesse caso, primeiro vai excluir todos os pontos e em seguida todas as vírgulas. Observe que no caso do ponto o R exige que o ponto esteja escrito entre colchetes[].
df_pensionistas_07_2020 <-
df_pensionistas_07_2020 %>%
mutate(`RENDIMENTO BRUTO` = str_remove_all(`RENDIMENTO BRUTO`,"[.]"),
`RENDIMENTO BRUTO` = as.numeric(str_remove_all(`RENDIMENTO BRUTO`,",")))
#no fim vamos repetir novamente a instrução do bloco anterior.
head(df_pensionistas_07_2020 %>%
select(`RENDIMENTO BRUTO`, `RENDIMENTO LIQUIDO`))
## # A tibble: 6 x 2
## `RENDIMENTO BRUTO` `RENDIMENTO LIQUIDO`
## <dbl> <chr>
## 1 192495 1.857,90
## 2 404619 4.046,19
## 3 3030513 24.518,19
## 4 541489 5.414,89
## 5 2515549 20.723,33
## 6 1910533 14.866,84
Observe que agora a coluna “Rendimento Bruto” não está mais marcada como chr e sim como dbl, que é um tipo numérico. Obseve ainda que se compararmos os valores de rendimento bruto antes e após a transformação veremos que o valor está 100 vezes maior. Isso decorre pelo fato de termos retirado a notação da vírgula. Precisamos então dividir a coluna por 100 para recuperarmos o valor correto. Veja abaixo:
#o novo valor da coluna rendimento bruto vai ser o valor que a coluna tem no momento divido por 100
df_pensionistas_07_2020 <-
df_pensionistas_07_2020 %>%
mutate(`RENDIMENTO BRUTO` = `RENDIMENTO BRUTO`/100)
#agora executamos novamente a exibição dos seis primeiros valores da tabela
head(df_pensionistas_07_2020 %>%
select(`RENDIMENTO BRUTO`, `RENDIMENTO LIQUIDO`))
## # A tibble: 6 x 2
## `RENDIMENTO BRUTO` `RENDIMENTO LIQUIDO`
## <dbl> <chr>
## 1 1925. 1.857,90
## 2 4046. 4.046,19
## 3 30305. 24.518,19
## 4 5415. 5.414,89
## 5 25155. 20.723,33
## 6 19105. 14.866,84
Perfeito. Agora temos o valor de rendimento bruto já transformado para numérico e está também com o valor correto. A coluna redimento líquido continua com problema. Temos que refazer todo o procedimento feito em redimento bruto na coluna rendimento líquido. É isso o que é feito logo abaixo.
df_pensionistas_07_2020 <-
df_pensionistas_07_2020 %>%
mutate(`RENDIMENTO LIQUIDO` = str_remove_all(`RENDIMENTO LIQUIDO`,"[.]"),
`RENDIMENTO LIQUIDO` = as.numeric(str_remove_all(`RENDIMENTO LIQUIDO`,",")))
df_pensionistas_07_2020 <-
df_pensionistas_07_2020 %>%
mutate(`RENDIMENTO LIQUIDO` = `RENDIMENTO LIQUIDO`/100)
head(df_pensionistas_07_2020 %>%
select(`RENDIMENTO BRUTO`, `RENDIMENTO LIQUIDO`))
## # A tibble: 6 x 2
## `RENDIMENTO BRUTO` `RENDIMENTO LIQUIDO`
## <dbl> <dbl>
## 1 1925. 1858.
## 2 4046. 4046.
## 3 30305. 24518.
## 4 5415. 5415.
## 5 25155. 20723.
## 6 19105. 14867.
Agora que as duas colunas já estão no formato correto, podemos calcular o total de rendimento bruto e de rendimento líquido pago processados em julho de 2020.
#somatório do rendimento bruto
sum(df_pensionistas_07_2020$`RENDIMENTO BRUTO`)
## [1] 2404020856
#somatório do rendimento líquido
sum(df_pensionistas_07_2020$`RENDIMENTO LIQUIDO`)
## [1] 2009970612
Com isso já temos repostas a uma pergunta que podem interessar quando se trata dos dados de pensionistas: considerando o último mês disponível, qual é o total de rendimentos líquido e bruto pagos pelo governo federal brasileiro? Vamos ver em seguida algumas funções de estatística descritiva que ajudam na formulação da resposta a outras perguntas para essa base.
Uma das melhores feramentas para descobrirmos o que caracteriza os dados que esperamos analisar é a estatística descritiva. E antes que se assuste, aqui vamos falar de coisas que já usamos há muito tempo: contagem, média, valor máximo, valor mínimo, mediana e também ordenação de dados por valores.
A base de dados de pensionista é do tipo tabular. As bases tabulares são aquelas que se estruturam em linhas e colunas. A contagem de ocorrências em dados tabulares, nada mais é do que a indicação do número de linhas de uma tabela que se enquadram dentro de um determinado parâmetro.
A tabela que estamos trabalhando se refere às pensões que foram pagas em julho de 2020. Para sabermos o número de pensões que se enquadram nessa característica basta contar o número de linhas da tabela. Veja o bloco de código abaixo.
#a função que indica o número de linhas de uma tabela á NROW.
NROW(df_pensionistas_07_2020)
## [1] 295468
Utilizando o bloco de código acima descobrimos que 295.468 é o número de pensões pagas em Julho de 2020.
Agora vamos imaginar que queremos saber se há mais pensionistas com pensões temporárias ou vitalícias. Existem algumas formas de se fazer isso. Por enquanto vamos explicar a mais simples que é com o uso de filtros.
#A função filter indica ao R qual a condição de filtro que se deseja executar sobre a tabela.
#No primeiro caso vamos filtrar todas as pensões cuja na ntureza ( campo Natureza Pensao) seja vitalícia
NROW(df_pensionistas_07_2020%>%
filter(`NATUREZA PENSAO` == "VITALICIA"))
## [1] 198063
#Fazemos a mesma coisa agora com as pensões temporárias
#Observe o operador == usado para fazer comparações de igualdade
NROW(df_pensionistas_07_2020%>%
filter(`NATUREZA PENSAO` == "TEMPORARIA"))
## [1] 97402
Observe no código acima que a função de contagem de linhas NROW não é mais aplicada à tabela completa, mas apenas ao resultado dos dois filtros sobre a tabela.
Com a contagem das linhas dos dois filtros temos que o número de pensões vitalícias corresponde a quase o dobro das pensões temporárias.
É muito simples descobrir os valores máximos e mínimos de qualquer conjunto de dados usando o R. Veja o bloco de código abaixo para o caso do valor máximo.
# Max: a função para descobrir o valor máximo
#Logo abaixo temos o valor máximo de rendimento bruto
max(df_pensionistas_07_2020$`RENDIMENTO BRUTO`)
## [1] 650661.1
#E aqui o valor máximo de rendimento líquido
max(df_pensionistas_07_2020$`RENDIMENTO LIQUIDO`)
## [1] 650661.1
E aqui abaixo veja como descobrimos o valor mínimo
# Min: a função para descobrir o valor mínimo
#Logo abaixo temos o valor mínimo de rendimento bruto
min(df_pensionistas_07_2020$`RENDIMENTO BRUTO`)
## [1] 0
#E aqui o valor mínimo de rendimento líquido
min(df_pensionistas_07_2020$`RENDIMENTO LIQUIDO`)
## [1] 0
Observe que aparecem valores estranhos ao que esperaríamos. No caso do valor máximo, os rendimentos bruto e líquido são iguais e esperaríamos o bruto > líquido.
Já no caso de valor mínimo os valores estão zerados para ambas variáveis.
Esse é um tipo de situação comum em ciência de dados: identificar ocorrência inesperadas que requerem maiores investigações e eventualmente faxina dos dados. Aqui vamos tentar investigar um pouco mais do que se tratam esses dados. Uma opção interessante é usar o ordenamento de valores e descobrir mais informações que possam nos ajudar a tomar decisões sobre os dados.
Vamos começar ordenando os valores em ordem decrescente e capturando apenas as 10 primeiras linhas
# a função slice_max vai nos trazer os n maiores valores de um conjunto de dados de acordo com uma variável que indicarmos.
# no caso abaixo o n=10 (os dez maiores valores) da variável rendimento bruto
# o select que vem logo em seguida indica ao R que queremos que sejam exibidas apenas as colunas `NOME DO SERVIDOR INSTITUIDOR`, `RENDIMENTO BRUTO`, `RENDIMENTO LIQUIDO`
df_pensionistas_07_2020 %>%
slice_max(`RENDIMENTO BRUTO`,n=10) %>%
select(`NOME DO SERVIDOR INSTITUIDOR`, `RENDIMENTO BRUTO`, `RENDIMENTO LIQUIDO`)
## # A tibble: 10 x 3
## `NOME DO SERVIDOR INSTITUIDOR` `RENDIMENTO BRUT… `RENDIMENTO LIQUID…
## <chr> <dbl> <dbl>
## 1 HEBER MARANHAO RODRIGUES 650661. 650661.
## 2 JOAO BATISTA ALVES NOVAES 398633. 289414.
## 3 JORGE VARGAS 97177. 43150.
## 4 JOSE GERALDO RODRIGUES DE ALCKMIN 92703. 45286.
## 5 LAERTE NEPOMUCENO VIANNA 89566. 60070.
## 6 RAIMUNDO HOLANDA FARIAS 80604. 54696.
## 7 MOACYR CORREA NUNES 79949. 52322.
## 8 ALBERICO ALUCIO DE ALCANTARA VELHO BAR… 79805. 78725.
## 9 ARMANDO LEITE ROLLEMBERG 78222. 37438.
## 10 CARLOS ANTONIO SOARES MEIRELLES 77152. 53604.
Como se vê, pode-se descartar problemas maiores na base já que da amostra dos 10 valores brutos mais elevados, apenas justamente o maior rendimento bruto tem valor igual ao maior rendimento líquido. Existem algumas possibilidades para que isso ocorra, mas pode ser um erro mesmo da base. O R nos ajudou aqui a descobrir com certa facilidade um ponto de investigação.
Agora vamos tentar ver o que está por trás dos valores mínimos zerados. As próximas linhas de código tratam disso
# a função slice_min vai nos trazer os n menores valores de um conjunto de dados de acordo com uma variável que indicarmos.
# no caso abaixo o n=10 (os dez maiores valores) da variável rendimento bruto
# o select que vem logo em seguida indica ao R que queremos que sejam exibidas apenas as colunas `NOME DO SERVIDOR INSTITUIDOR`, `RENDIMENTO BRUTO`, `RENDIMENTO LIQUIDO`
df_pensionistas_07_2020 %>%
slice_min(`RENDIMENTO BRUTO`, n=10) %>%
select(`NOME DO SERVIDOR INSTITUIDOR`, `RENDIMENTO BRUTO`, `RENDIMENTO LIQUIDO`)
## # A tibble: 3,722 x 3
## `NOME DO SERVIDOR INSTITUIDOR` `RENDIMENTO BRUTO` `RENDIMENTO LIQUIDO`
## <chr> <dbl> <dbl>
## 1 MARIA RODRIGUES DA SILVA 0 0
## 2 JOSE FRANCISCO DOS SANTOS 0 0
## 3 WALTER PEREIRA PINTO 0 0
## 4 FERNANDO ROCHA DA SILVA 0 0
## 5 FRANCISCO MONTEIRO MENDES DA COSTA 0 0
## 6 MAXIMINO OLIVEIRA DA SILVA 0 0
## 7 ISAAC SIMINANKRU MARINHO XERENTE 0 0
## 8 BENEVENUTO RIEDEL 0 0
## 9 RAIMUNDO SILVINO 0 0
## 10 RAIMUNDO SILVINO 0 0
## # … with 3,712 more rows
Observe que o R indica que o resultado do código é uma tabela com o número de linhas bem maior do que esperávamos: ## # A tibble: 3,722 x 3. São mais de 3.700 linhas a mais. Isso se deve porque existem 3.722 linhas em que o valor de rendimento bruto = 0. Esse achado sugere que o valor mínimo da base bruta não caracteriza por si só os menores valores de rendimento bruto ou de rendimento líquido. É preciso retirar da nossa análise essas linhas para chegarmos a valores mais apropriados. Vamos ver como se faz isso no bloco de código abaixo.
#nesse bloco de código, antes de descobrirmos os valores mínimos fazemos o filtro para que permaneçam na nossa análise apenas as linhas da tabela que tenham valor de rendimento bruto >= 0.01. Para isso usamos a função filter
df_pensionistas_07_2020 %>%
filter(`RENDIMENTO BRUTO`>=0.01)%>%
slice_min(`RENDIMENTO BRUTO`, n=10) %>%
select(`NOME DO SERVIDOR INSTITUIDOR`, `RENDIMENTO BRUTO`, `RENDIMENTO LIQUIDO`)
## # A tibble: 11 x 3
## `NOME DO SERVIDOR INSTITUIDOR` `RENDIMENTO BRUTO` `RENDIMENTO LIQUIDO`
## <chr> <dbl> <dbl>
## 1 <NA> 5.4 5.4
## 2 <NA> 16.0 16.0
## 3 JUSTO SEREHITE 17.8 17.8
## 4 <NA> 28.8 28.8
## 5 JOAO GUILHERME DA SILVA 35.4 35.4
## 6 CARLOS ALBERTO DE LIMA PINTO 45.6 45.6
## 7 FRANCISCO DE ASSIS DE SOUZA RAMOS 46.9 39.9
## 8 MIGUEL SILVA DE SOUZA 54.5 54.5
## 9 NEWTON SALGADO 68.8 68.8
## 10 <NA> 69.4 69.4
## 11 <NA> 69.4 69.4
Agora temos a informação no caminho que desejamos. Muito embora os valores ainda estejam muito baixos. Observe ainda que existem algumas linhas em que não há informação do servidor instituidor. Isso sugere uma tarefa de avaliação dos valores ausentes e tentar entender o que gera esses valores tão baixos para tomar decisão sobre o que fazer na faxina de dados. Mas isso é outro assunto. Por enquanto parece que está fácil de caracterizar os valores mínimos e máximos com as instruções que passamos até agora, que é o objetivo dessa seção.
A média e a mediana são conhecidas como medidas de centralidade na estatística. A função delas é caracterizar um conjunto de dados. É importante conhecer as duas medidas já que em algumas situações uma pode ser mais recomendada que a outra.
Vamos começar com o cálculo da média. Lembrando que essa medida é calculada pela somatória dos valores/número de valores. No bloco abaixo vamos conhecer o uso da média no R.
# a função mean faz o cálculo da média
# abaixo a média dos rendimentos brutos e dos rendimentos líquidos
mean(df_pensionistas_07_2020$`RENDIMENTO BRUTO`)
## [1] 8136.315
mean(df_pensionistas_07_2020$`RENDIMENTO LIQUIDO`)
## [1] 6802.668
Como era de se esperar a média dos valores de rendimento bruto é maior do que o rendimento líquido.
Agora vamos ver o cálculo da mediana. Antes, vale recordar que a mediana é uma medida de posição. É o valor que fica no meio de uma série de valores ordenados.
Se temos, por exemplo, onze valores numéricos, ordenamos esses valores e a mediana será o valor que ficar na posição 6, já que teremos cinco valores maiores e cinco valores menores do que o que está na posição 6.
# a função median faz o cálculo da média
# abaixo a mediana dos rendimentos brutos e dos rendimentos líquidos
median(df_pensionistas_07_2020$`RENDIMENTO BRUTO`)
## [1] 5799.02
median(df_pensionistas_07_2020$`RENDIMENTO LIQUIDO`)
## [1] 5179.965
Observe que quando se trata de mediana, novamente o valor relativo a rendimento bruto é maior do que o relativo a rendimento líquido. Mas esse achado dos valores da mediana traz alguns pontos para análise
O primeiro é que a diferença entre as duas medianas é bem menor do que a diferença entre as duas médias
O segundo é que os valores de médias para ambas variáveis, mas principalmente para rendimento bruto, é bem maior do que a mediana.
Essas situações são relativamente comuns. É importante entender a dinãmica de formação desses valores e a distribuição dos valores para encontrar o que melhor caracteriza os dados, se a média ou mediana. Esse é um assunto importante e que deve ser melhor explorado. Aqui foge do objetivo dessa aula.
Usando as funções do pacote tidyverse fica muito fácil de se trabalhar com colunas em tabelas do R. Às vezes é necessario alterar valores e tipos. E algumas vezes é também interessante acrescentar novas colunas que são formadas a partir de colunas já previamente existente. Vamos explorar um pouco essas possibildiades nesse bloco.
Na seção anterior vimos como fazer modificações nas duas colunas relativas a valores numéricos. Outro tipo de variável que é bem comum fazermos modificações são as do tipo data. Na tabela que estamos trabalhando as datas estão em um formato pouco usual e que não é rapidamente reconhecida pelo R como data. Isso impede a possibilidade de se fazer operações de data que possam responder, por exemplo, qual a pensão mais antiga paga em Julho de 2020.
Antes de prosseguirmos mostrando como se faz a transformação de variável tipo data, é interessante dar uma olhada em algumas amostras de datas para duas variáveis desse tipo.
head(df_pensionistas_07_2020%>%
select(`DATA INICIO DO BENEFICIO`, `DATA DE NASCIMENTO` ))
## # A tibble: 6 x 2
## `DATA INICIO DO BENEFICIO` `DATA DE NASCIMENTO`
## <chr> <chr>
## 1 10021998 18041951
## 2 25012016 14011948
## 3 13102012 18031954
## 4 20112012 27111943
## 5 21082018 10051935
## 6 26042000 18041925
Observe que as datas são formadas pela concatenação de dia, mês e ano. Por exemplo, na primeira linha a data 10021998 corresponde a 10/02/1998. O nosso objetivo é fazer uma transformação para que o R possa compreender que isso é uma data. Para o R uma data tem que estar no formato aaaa-mm-dd. No caso da data exemplificada essa data teria que ser representada como 1998-02-10.
No bloco de código logo abaixo vamos ver como fazemos modificações em colunas
#para podermos usar as funções que facilitam o trabalho com datas é necessário usar o pacote lubridate. Lembre de instalá-lo antes, caso não esteja ainda instaldo, usando a função install.package()
library(lubridate)
#A função dmy indica que a variável que está sendo passada como parâmetro está no formato dia, mês, ano. Com essa informação o R é capaz de fazer a transformação e gerar a data correta
df_pensionistas_07_2020<-
df_pensionistas_07_2020 %>%
mutate(`DATA INICIO DO BENEFICIO` = dmy(`DATA INICIO DO BENEFICIO`),
`DATA DE NASCIMENTO` = dmy(`DATA DE NASCIMENTO`))
head(
df_pensionistas_07_2020%>%
select(`DATA INICIO DO BENEFICIO`, `DATA DE NASCIMENTO`))
## # A tibble: 6 x 2
## `DATA INICIO DO BENEFICIO` `DATA DE NASCIMENTO`
## <date> <date>
## 1 1998-02-10 1951-04-18
## 2 2016-01-25 1948-01-14
## 3 2012-10-13 1954-03-18
## 4 2012-11-20 1943-11-27
## 5 2018-08-21 1935-05-10
## 6 2000-04-26 1925-04-18
Observe agora que as duas datas que trabalhamos já estão no formato correto e podem ser usadas em operações típicas de data.
A partir das duas colunas que acabamos de fazer os ajustes, vamos criar duas novas colunas que indicam o tempo de recebimento da pensão e idade de beneficiário. Vamos ver como isso pode ser feito.
# Para fazermos o cálculo das duas novas variáveis vamoos precisar usar mais duas funções que estão no pacote lubridate que já foi carregado no bloco de códigos anterior. Essas funções são today e year
# A função today informa a data de hoje
# A função year informa o ano de uma determinada data
df_pensionistas_07_2020<-
df_pensionistas_07_2020 %>%
mutate(tempo_recebimento_pensao = year(today()) - year(`DATA INICIO DO BENEFICIO`)) %>%
mutate(idade_beneficario = year(today()) - year(`DATA DE NASCIMENTO`))
df_pensionistas_07_2020 %>%
select(`NOME DO BENEFICIARIO`, tempo_recebimento_pensao, idade_beneficario)
## # A tibble: 295,468 x 3
## `NOME DO BENEFICIARIO` tempo_recebimento_pensao idade_beneficario
## <chr> <dbl> <dbl>
## 1 CARMEN LUCINDA FARKAS DE ARAUJO 22 69
## 2 MARIA DE LOURDES DA SILVA 4 72
## 3 MARIZETE DIAS SOUZA 8 66
## 4 MARGARIDA ALEXANDRIA 8 77
## 5 MARIA JOSE PINTO LIMA 2 85
## 6 MARIA AMELIA DE ARAUJO LIMA 20 95
## 7 ELI DA SILVA JORGE 2 85
## 8 MARIA DO SOCORRO PESSOA DE SOUSA 3 44
## 9 DEIVID PEREIRA DE SOUSA 3 19
## 10 GABRIEL PEREIRA DE SOUSA 3 15
## # … with 295,458 more rows
Aqui vale explorar um pouco mais o bloco de código logo acima. Começando pelo trecho abaixo
year(today())
Esse trecho vai trazer como resultado o ano [função year] referente à data de hoje [função today()]
Vamos analisar agora esse outro trecho de código
tempo_recebimento_pensao = year(today()) - year(`DATA INICIO DO BENEFICIO`)
Aqui estamos calculando o intervalo em anos entre duas datas. No caso, a diferença entre o ano da data de hoje e a data do início do benefício
Agora que já temos a data de início do benefício, podemos saber, por exemplo, quem são os 10 beneficiários com os maiores tempos de benefício.
#Aqui usamos novamente a função slice_mas para descobrir os N maiores valores de uma variável
df_pensionistas_07_2020 %>%
slice_max(tempo_recebimento_pensao, n=10) %>%
select(`NOME DO BENEFICIARIO`, tempo_recebimento_pensao)
## # A tibble: 13 x 2
## `NOME DO BENEFICIARIO` tempo_recebimento_pensao
## <chr> <dbl>
## 1 WANDA CARDOSO TOROK 107
## 2 MARIA DE PAIVA GUSMAO 100
## 3 ZILDA SAMPAIO ORSANO 99
## 4 MARINA RITA ABRANCHES DE OLIVEIRA 99
## 5 ARMINDA SA STIEBLER 99
## 6 OLINDA ROSA DE CARVALHO 98
## 7 ISOLINA GONZAGA BENTES 97
## 8 JURANDYR GOMES DA SILVA MELLO 97
## 9 LUIZA VASCONCELOS DE JESUS 96
## 10 CECILIA LINO MOREIRA 96
## 11 LAURA MARIA BRANDAO 96
## 12 MARIA CLEO VASCONCELOS SALEM 96
## 13 URBANA DOS PASSOS SOUZA 96
Temos então a impressionante informação de que existem benefícios seculares. Se isso não for erro da base, dá uma boa dica de matéria, não é mesmo?
E que tal agora descobrirmos os beneficiários mais velhos. Vamos seguir a mesma lógica do bloco de código anterior.
#Aqui usamos novamente a função slice_mas para descobrir os N maiores valores de uma variável
df_pensionistas_07_2020 %>%
slice_max(idade_beneficario, n=10) %>%
select(`NOME DO BENEFICIARIO`, idade_beneficario)
## # A tibble: 10 x 2
## `NOME DO BENEFICIARIO` idade_beneficario
## <chr> <dbl>
## 1 DULCINA RIBEIRO 120
## 2 MERCEDES DA COSTA LOUREIRO 118
## 3 WILHERMINE LUEB HEIDEGGER 117
## 4 ALICE TAVARES DE OLIVEIRA 117
## 5 ANGELINA DINARDI 116
## 6 AMANDA GALVAO DE SA CAMPOS 115
## 7 ANNA DOS SANTOS DIAS 115
## 8 ALMERINDA FERRARI DE OLIVEIRA 115
## 9 FRANCISCA LUIZA DE OLIVEIRA 115
## 10 LEONIRA FERREIRA DE MORAIS 114
Novamente as informações que aparecem são de chamar muita atenção. A lista dos beneficários mais idosos são de super-centenários. De novo isso indica ou problema na base ou uma dica de matérias muito interessantes.
Isso nos leva à curiosidade de fazer novas ordenações, levando agora em consideração as duas informações de tempo de benefício e idade do beneficiário no resultado da consulta.
#Aqui usamos novamente a função slice_mas para descobrir os N maiores valores de uma variável
df_pensionistas_07_2020 %>%
slice_max(idade_beneficario, n=10) %>%
select(`NOME DO BENEFICIARIO`, idade_beneficario, tempo_recebimento_pensao)
## # A tibble: 10 x 3
## `NOME DO BENEFICIARIO` idade_beneficario tempo_recebimento_pensao
## <chr> <dbl> <dbl>
## 1 DULCINA RIBEIRO 120 53
## 2 MERCEDES DA COSTA LOUREIRO 118 45
## 3 WILHERMINE LUEB HEIDEGGER 117 NA
## 4 ALICE TAVARES DE OLIVEIRA 117 73
## 5 ANGELINA DINARDI 116 29
## 6 AMANDA GALVAO DE SA CAMPOS 115 27
## 7 ANNA DOS SANTOS DIAS 115 16
## 8 ALMERINDA FERRARI DE OLIVEIRA 115 NA
## 9 FRANCISCA LUIZA DE OLIVEIRA 115 29
## 10 LEONIRA FERREIRA DE MORAIS 114 7
#Aqui usamos novamente a função slice_mas para descobrir os N maiores valores de uma variável
df_pensionistas_07_2020 %>%
slice_max(tempo_recebimento_pensao, n=10) %>%
select(`NOME DO BENEFICIARIO`, tempo_recebimento_pensao, idade_beneficario)
## # A tibble: 13 x 3
## `NOME DO BENEFICIARIO` tempo_recebimento_pensao idade_beneficario
## <chr> <dbl> <dbl>
## 1 WANDA CARDOSO TOROK 107 107
## 2 MARIA DE PAIVA GUSMAO 100 101
## 3 ZILDA SAMPAIO ORSANO 99 98
## 4 MARINA RITA ABRANCHES DE OLIVEIRA 99 104
## 5 ARMINDA SA STIEBLER 99 102
## 6 OLINDA ROSA DE CARVALHO 98 101
## 7 ISOLINA GONZAGA BENTES 97 99
## 8 JURANDYR GOMES DA SILVA MELLO 97 110
## 9 LUIZA VASCONCELOS DE JESUS 96 100
## 10 CECILIA LINO MOREIRA 96 97
## 11 LAURA MARIA BRANDAO 96 99
## 12 MARIA CLEO VASCONCELOS SALEM 96 96
## 13 URBANA DOS PASSOS SOUZA 96 98
Vimos o ganho de análises quando acrescentamos novas colunas a partir de infomações de data. Agora vamos acrescentar uma outra coluna, faixa de rendimento bruto, que no caso será de tratamento de coluna de valor numérico.
#para identificar as faixas salariais usamos duas funcões case_hwen e betewwem
# a função case_when testa condições para identificar o valor que uma variável vai assumir.
#No caso, a função case_when vai testar condições sobre a variável rendimento bruto para gerar o valor para a variável faixa_rendimento_bruto
# a função between indica se um dado valor está dentro de uma faixa de valores numéricos
df_pensionistas_07_2020 <-
df_pensionistas_07_2020 %>%
mutate(faixa_rendimento_bruto = case_when(
`RENDIMENTO BRUTO`<=2000 ~ '0-2000 reais',
between(`RENDIMENTO BRUTO`,2001, 4000) ~ 'Faixa 1: 2001-4000 reais',
between(`RENDIMENTO BRUTO`,4001, 6000) ~ 'Faixa 2: 4001-6000 reais',
between(`RENDIMENTO BRUTO`,6001, 8000) ~ 'Faixa 3: 6001-8000 reais',
between(`RENDIMENTO BRUTO`,8001, 10000) ~ 'Faixa 4: 8001-10000 reais',
between(`RENDIMENTO BRUTO`,10001, 15000) ~ 'Faixa 5: 10001-15000 reais',
`RENDIMENTO BRUTO` >= 15001 ~'Faixa 5: 15001 reais ou mais')
)
Com a execução do bloco de código acima, a tabela já possui a informação da faixa de valores de rendimento bruto que será usada para tratamento de agrupamentos.
Uma das possiblidades interessantes de se trabalhar com linguagem de programação, como o R, é a facilidade de se fazer cruzamentos com outras tabelas.
Vamos imaginar, por exemplo, que queremos identificar fenômenos que relacionem o recebimento de pensões à abertura de empresas. Para isso, vamos cruzar a tabela de pensionistas com a tabela de sócios de empresas, disponível no Brasil.io.
#A função ReadDS permite ao R trabalhar com objetos já trabalhados em outras sessões de uso da linguagem
socio_amostra <- readRDS("data/socio_amostra.rds")
#Para que se possa trabalhar a junção de duas tabelas, é recomendável que ambas tabelas tenham uma coluna com o mesmo nome, tipo e significado. Nesse caso a tabela socio_amostra possui uma coluna chamada chave que é composta pela junção do CPF e do nome do beneficiário. Vamos então criar uma nova coluna na tabela de pensionistas que estamos trabalhando que vai ter exatamente essas mesmas características. Para isso, usamos a função mutate.
df_pensionistas_07_2020<-
df_pensionistas_07_2020 %>%
mutate( chave= str_c(`CPF DO BENEFICIARIO`, `NOME DO BENEFICIARIO`))
#Após garantirmos que as duas tabelas têm um campo em comum usamos a função inner_join que vai juntar a tabela df_pensionistas_07_2020 com a tabela socio_amostra. O resultado dessa junção é armazenado numa nova tabela: df_Pensionista_socio
df_Pensionista_socio<-
df_pensionistas_07_2020 %>%
inner_join(socio_amostra)
Acabamos de criar uma outra tabela com 300 linhas que apresentam todas os pensionistas que foram localizadas numa tabela que tem 300.000 CPFs ligados a alguma sociedade de empresa. Um exercício interessante a ser feito aqui é tentar diferenciar o grupo dos pensionistas sócios do conjunto total dos pensionistas em julho de 2020. Vamos comparar, por exemplo, a média dos rendimentos brutos e líquidos.
#Comparação de médias de rencimentos bruntos
mean(df_pensionistas_07_2020$`RENDIMENTO BRUTO`)
## [1] 8136.315
mean(df_Pensionista_socio$`RENDIMENTO BRUTO`)
## [1] 11305.28
#Comparação de médias de idade de beneficiário
mean(df_pensionistas_07_2020$idade_beneficario, na.rm = TRUE)
## [1] 69.21876
mean(df_Pensionista_socio$idade_beneficario, na.rm = TRUE)
## [1] 69.87021
#Comparação de médias de tempo de rendimento de pensão
mean(df_pensionistas_07_2020$tempo_recebimento_pensao, na.rm = TRUE)
## [1] 20.67559
mean(df_Pensionista_socio$tempo_recebimento_pensao, na.rm = TRUE)
## [1] 16.32153
Observando o que sai nas nas seis linhas de código acima, parece que as médias de rendimento bruto de pensionistas que são sócios é bem maior do que a mesma média do conjunto total. Já quando se vê a comparação das idades dos beneficiários não há praticamente diferença nas médias. Por outro lado volta a ter diferença nas médias quando se compara o tempo de recebimento das pensões.
Agora vamos fazer algo parecido com a tabela dinâmica do Excel / Google Spreadsheet. Para agrupar os dados usamos group_by()
e informamos por qual coluna queremos agrupar.
Em seguida, o summarise()
- ou summarize()
- vai contar o número de linhas, com n()
. E também vai somar os valores da coluna “RENDIMENTO BRUTO”, com sum()
.
pens_orgao <- df_pensionistas_07_2020 %>%
group_by(`NOME DO ORGAO`) %>%
summarise(contagem = n(),
soma = sum(`RENDIMENTO BRUTO`))
A única diferença em comparação com o código anterior é a coluna informada em group_by()
.
pens_beneficiario <- df_pensionistas_07_2020 %>%
group_by(`TIPO DE BENEFICIARIO`) %>%
summarise(contagem = n(),
soma = sum(`RENDIMENTO BRUTO`))
Novamente, só vamos mudar a coluna informada dentro de group_by()
.
pens_tipo <- df_pensionistas_07_2020 %>%
group_by(`NATUREZA PENSAO`) %>%
summarise(contagem = n(),
soma = sum(`RENDIMENTO BRUTO`))
Mudamos novamente a coluna informada dentro de group_by()
. Além de n()
e sum()
, aqui também usamos mean()
e median()
.
pens_uf <- df_pensionistas_07_2020 %>%
group_by(`UF DA UPAG DE VINCULACAO`) %>%
summarise(contagem = n(),
soma = sum(`RENDIMENTO BRUTO`),
média = mean(`RENDIMENTO BRUTO`),
mediana = median(`RENDIMENTO BRUTO`))
Usamos o filter()
para filtrar o órgão de interesse. Depois, usamos arrange()
para ordenar em ordem decrescente, com desc()
.
pens_orgao_MS <- df_pensionistas_07_2020 %>%
filter(`NOME DO ORGAO` == "MINISTERIO DA SAUDE") %>%
arrange(desc(`RENDIMENTO BRUTO`))
Aqui usamos o filter()
novamente. Desta vez, definimos interesses em duas colunas. Os dois quesitos precisam ser cumpridos.
pens_cargo_MS_MEDICO <- df_pensionistas_07_2020 %>%
filter(`NOME DO ORGAO` == "MINISTERIO DA SAUDE" &
`CARGO SERVIDOR INSTITUIDOR` == "MEDICO") %>%
arrange(desc(`RENDIMENTO BRUTO`))
Agora, pedimos ao filter()
para manter apenas as linhas em que aparece alguma daquelas siglas.
pens_cargo_MS_ME_MCTIC <- df_pensionistas_07_2020 %>%
filter(`SIGLA DO ORGAO` == "MS" |
`SIGLA DO ORGAO` == "ME" |
`SIGLA DO ORGAO` == "MCTIC") %>%
arrange(desc(`RENDIMENTO BRUTO`))
Conforme já dito logo no início, os dados com que estamos trabalhando estão disponíveis na internet. Vamos ver como podemos usar o R para baixar esses dados para seu ambiente computacional. Também vamos ver como salvar o trabalho que você fez em arquivo CSV para ser aproveitado em outros usos que não seja a partir da linguagem R e, por fim, você vai prender a ler vários arquivos com um único comando.
É muito simples fazer o download de um arquivo CSV. Basta uma única instrução. Veja abaixo.
# A função downloadfile vai fazer o download a partir de um endereço de internet especificado e acrescentar o arquivo numa pasta de destino informada
download.file("http://repositorio.dados.gov.br/segrt/pensionistas/PENSIONISTAS_072020.zip", destfile = "data/PENSIONISTAS_072020.zip", mode="wb")
Você vai observar na pasta destino que esse arquivo veio zipado. Isso vai dificultar a maior parte dos trabalhos que queiramos fazer com o arquivo. O mais interessnate é descompactá-lo e em seguida trabalhar com o formato CSV. Veja abaixo como fazer isso.
unzip(zipfile = "data/PENSIONISTAS_072020.ZIP", exdir = "data/csv")
A função write.csv()
salva o dataframe que você criou usando o R. Basta informar o nome do dataframe e, em seguida, o nome do arquivo que você quer gerar e a extensão CSV.
write.csv(pens_cargo_MS_ME_MCTIC, "pens_cargo_MS_ME_MCTIC.csv")
Baixamos todos os CSVs referentes aos meses de 2020. Em seguida, lemos o CSV com o fread()
no RStudio e logo salvamos o dataframe com saveRDS()
. Para janeiro de 2020, por exemplo, veja abaixo.
OBS: Você não precisa fazer isso porque todos os arquivos RDS já estão salvos dentro de uma pasta chamada “pensionistas_2020”, que está dentro da pasta “data”.
PENSIONISTAS_012020 <- fread(“PENSIONISTAS_012020.csv”) saveRDS(PENSIONISTAS_012020, file = “PENSIONISTAS_012020.rds”)
Abaixo listamos os arquivos RDS que estão na nossa pasta.
arquivos <- list.files("data/pensionistas_2020")
Agora vamos informar dentro de map_df()
o caminho (“data/pensionistas_2020/”), seguido pelo nome dos arquivos (estão guardados dentro “arquivos”), a função readRDS
(que faz a leitura de RDS) e também .id = "source"
para uma coluna difereciar o arquivo de origem.
getwd()
## [1] "/Users/gabrielacaesar/Downloads/oficina-R-master"
pensionistas_2020_all <- map_df(paste0("data/pensionistas_2020/", arquivos), readRDS, .id = "source")
Obrigado por acompanhar a oficina até aqui. Há inúmeras possibilidades com o R, então não deixe de pesquisar e buscar por outros materiais.
Obrigado também à Abraji pela iniciativa e pelo convite.
Caso queira entrar em contato, nós estamos disponíveis aqui:
Gabriela Caesar - Twitter / Site
Fernando Barbalho - Twitter