#AULA 11 - Tidyverse #Estruturacao de conjuntos de dados para facilitar a analise: Tidy data e Tidyverse #Recomendacao: Em "Tools" > "Global options" > "Code Editing" > marque a opcao "soft-wrap R source files". Esta opcao ira quebrar automaticamente o texto de acordo com a largura da janela do script. #Dica: Em "Tools" > "Global options" > "Code display" > marque a opcao "show margin". Esta opcao ira indicar (por meio de uma linha vertical) uma quebra para que possamos ajustar a janela do script. # Instalar o pacote "tidyverse" install.packages("tidyverse") # Lendo o pacote "tidyverse" library(tidyverse) # Comandos necessarios para trabalhar com o banco de dados "DSR". # DSR eh uma colecao de conjuntos de dados. # Montada para o livro Data Science with R by Garrett Grolemund. # Estes dados estao salvos online como um repositorio do github (github.com/garrettgman/DSR). install.packages("devtools") library(devtools) devtools::install_github("garrettgman/DSR") library(DSR) ###### 1. Analisando bancos do tipo "Tibble" #lendo o banco population # mostra apenas as primeiras 10 linhas (se > 20) e todas as colunas que cabem na tela population str(population) class(population) #comparando com data.frame #fazendo coercao para data.frame as.data.frame(population) #comando temporario ja que nao estamos inserindo em um objeto #lendo o bando de dados who who #reduza ou aumente a largura da janela do console e note que a quantidade de variaveis se altera #comparando com data.frame #fazendo coercao para data.frame who <- as.data.frame(who) who #Para fazer a coercao de um data.frame em uma Tibble who <- as_tibble(who) who ###### 2. Ferramentas do pacote "Tidyr" #### 2.1 SPREAD() ## Este comando distribui as informacoes contidas em uma variavel para novas variaveis. Ou seja, "joga" uma variavel nas colunas. #spread (data = nome do banco de dados, key = nome da coluna que possui mais de uma variavel, value = nome da coluna que apresenta os valores) #spread(data = , key = , value = ) #lendo a tabela 2 table2 #utilizando o comando spread spread(data = table2, key = type , value = count) #Outro modo de executar o mesmo comando. Neste eh utilizada a operacao pipe. # pipe - ctrl + shift + m = %>% #Desde que se mantenha a ordem do default, as informacoes "data ="; "key="; "value=" nao sao necessarias. table2 %>% spread (key = type , value = count) #### 2.2 GATHER () ## Este comando faz o reverso do spread (). Agrupa em uma unica coluna "chave" um conjunto de nomes de colunas contidos em uma variavel. Alem disso, coleta os valores correspondentes dessas colunas e os coloca em uma variavel de valor unico. Ou seja, "empilha" o banco de dados. #gather (nome do banco, nome da coluna chave, nome da coluna dos valores, colunas que nao sao variaveis). #gather(data= , key =, value = , nome das colunas que nao sao variaveis) #lendo a tabela4 table4 #utilizando o comando gather gather(data= table4, key ="year", value = "cases", "1999", "2000") gather(data= table4, key ="year", value = "cases", "1999":"2000") gather(data= table4, key =year, value = cases, "1999":"2000") #Outro modo de executar o mesmo comando. Neste eh utilizada a operacao pipe. Desde que se mantenha a ordem do default, as informacoes "data ="; "key="; "value=" nao sao necessarias. Eh possivel utilizar a posicao das colunas. table4 %>% gather(key=year, value=cases, 2:3) table4 %>% gather(year, cases, 2:3) table4 %>% gather(year, cases, c(2, 3)) table4 %>% gather(year, cases, -1) #### 2.3 SEPARATE() ## Este comando separa uma coluna em varias utilizando um separador especificado. #separete (nome do banco, nome da col que sera dividida, nome das outras colunas, informacaoo de qual eh o separador). #separate(data = , col = , into = c("coluna1", "coluna2"), sep = ' ') #lendo a tabela3 table3 #utilizando o comando separate separate(data = table3, col = rate, into = c("cases", "population"), sep = '/') #Outra modo de executar o mesmo comando. Neste eh utilizada a operacao pipe. Desde que se mantenha a ordem do default, as informacoes "data ="; "col="; "into=" e "sep=" nao sao necessarias. table3 %>% separate(col = rate, into = c("cases", "population")) # separou a taxa em casos e populacao # sem pipe separate(data = table3, col = rate, into = c("cases", "population")) # separou a taxa em casos e populacao table3 %>% separate(rate, c("cases", "population")) # separou a taxa em casos e populacao #Outras formas de explorar table3 %>% separate( year, into = c("century", "year"), sep = 2) # separou a coluna year em ano e seculo table3 %>% separate(rate, into = c("cases", "population"), remove = FALSE) # separou a taxa em casos e populacao, mantendo a coluna taxa #### 2.4 UNITE() ## Este comando junta duas ou mais colunas usando algum separador. # unite (nome do banco, nome da nova variavel, nome das outras colunas que serao unidas, especificacao de qual separador devera conter entre elas) # unite(data=, col=, sep = "") #lendo a tabela6 table6 #utilizando o comando unite unite(data = table6, col = new, century, year, sep = "") #Outra modo de executar o mesmo comando. Neste e utilizada a operacao pipe. Desde que se mantenha a ordem do default, as informacoes "data ="; "col="; e "sep=" nao sao necessarias. table6 %>% unite(new, century, year, sep = "") ###### 3. Ferramentas do pacote "dplyr" #### 3.1 FILTER () ## Este comando seleciona linhas por meio de condi??es estabelecidas. ## filter(data=, condi??o) #lendo a tabela 1 table1 # utilizando o comando filter table1 %>% filter(cases > 200000) # seleciona linhas maiores que 200000 casos table1 %>% filter(year == 1999, cases > 200000) # seleciona linhas correspondentes ao ano 1999 e maiores que 2000000 casos # , = e; | = ou table1 %>% filter(year == 1999 | cases > 200000) # seleciona linhas correspondentes ao ano 1999 ou maiores que 2000000 casos #### 3.2 SELETC() ## Este comando seleciona colunas por meio de condicoes estabelecidas. ## seletc(data=, condicao) #lendo a tabela 1 table1 #utilizando o comando seletc table1 %>% select(1:3) # seleciona as colunas de 1 a 3, por meio das posicoes das colunas. table1 %>% select(country:cases) # seleciona as colunas de posicao 1 a 3, por meio dos nomes das colunas. table1 %>% select(country, cases) # seleciona as colunas de posicao 1 e 3, por meio dos nomes das colunas. table1 %>% select(1, 3) # seleciona as colunas de posicao 1 e 3, por meio das posicoes das colunas. table1 %>% select(-year) # seleciona todas as colunas com excecao da indicada table1 %>% select(-c(year, cases)) # seleciona todas as colunas com excecao das indicadas table1 %>% select(-c(2, 3)) # seleciona todas as colunas com excecao das indicadas pela posicao table1 %>% select(starts_with('ca')) # seleciona todas as colunas que se iniciam com as letras 'ca' table1 %>% select(ends_with('y')) # seleciona todas as colunas que se terminam com a letra 'y' table1 %>% select(contains('a')) # seleciona todas as colunas que contem a letra 'a' table1 %>% select_if(is.factor) #seleciona as variaveis que sao factor table1 %>% select_if(is.character) #seleciona as variaveis que sao caracter bd <- as.data.frame(matrix(runif(20, 10, 30), ncol = 5)) #criando um banco de dados com uma matrix de distribuicao uniforne, com n de 20, 5 colunas e valores de 10 a 30. bd$k1 <- matrix(runif(4, 10, 30), ncol = 1) #incluindo uma coluna com nome "k1" bd %>% select(num_range(prefix = 'V', 4:6)) # seleciona apenas as colunas que se iniciam com a letra 'v', dentre as colunas de posicao 4 a 6. #### 3.3 ARRANGE() ## Este comando ordena o banco de dados tomando como referencia uma ou mais colunas. ## arrange(data=, condicao) table1 %>% arrange(year) # ordenando o bando de dados, tomando como referencia a variavel year de forma crescente. table1 %>% arrange(year, desc(country)) # ordenando o bando de dados, tomando como referencia a variavel 'year' em primeiro lugar, de forma crescente e a variavel 'country' em segundo lugar, de forma decrescente. #### 3.4 RENAME() ## Este comando renomeia as variaveis # rename(data =, novo_nome = nome_atual) table1 %>% rename(ano = year, casos = cases, populacao = population) #### 3.5 DISTINCT() ## Este comando remove linhas duplicadas ## distinct(data = ) table1 table1.1 <- rbind(table1[c(1, 1, 3), ], table1) # criando um novo banco com as 3 primeiras linhas duplicadas table1.1 %>% distinct() #removendo duplicadas table1.1 %>% distinct(country, year) # considerando duplicatas so nas colunas especificadas #### 3.6 MUTATE() ## Este comando pode transformar, adicionar ou redefinir colunas # mutate(data =, condicao) table1 table1 %>% mutate(year = year + 10, rate = cases/ population) # retorna todas as colunas do banco de dados, com os valores da coluna 'year' somados 10 e com uma nova coluna 'rate'. table1 %>% mutate(id = seq(1,6,1)) #acrescenta uma coluna id table1 %>% mutate_if(is.integer, log) # transforma apenas as colunas que satisfazem uma condicao estabelecida table1 %>% mutate_at(3:4, mean) # aplica uma funcao so as colunas especificadas table1 %>% mutate_all(as.character) # aplica uma funcao a todas as colunas #### 3.6 TRANSMUTE() ## Este comando segue a mesma logica que o comando 'mutate'. No entando, sao retornadas so colunas transformadas ou adicionadas. #transmute (data=, condicao) table1 table1 %>% transmute(year = year + 10, rate = cases/ population) #retorna apenas as colunas ano e taxa table1 %>% transmute(id = seq(1,6,1)) #retorna apenas a coluna id criada #### 3.6 SUMMARISE() ## Este comando aplica funcoes que a partir de uma coluna retornam um unico valor. # summarise(data=, condicao) table1 table1 %>% summarise(media_populacao = mean(population), total_casos = sum(cases)) # retorna os valores da media da populacao e do total de casos. table1 %>% summarise_at(2:3, mean) #retorna os valores medios das variaveis ano e casos table1 %>% summarise_if(is.numeric, max) #retorna os valores maximos das variaveis numericas #### 3.6 GROUP_BY() # Este comando permite realizar operacoes dentro de grupos # group_by(data=, condicao) table1 %>% group_by(country) %>% summarise(media_populacao = mean(population), total_casos = sum(cases)) #calcula a media da populacao e total de casos segundo cada pais. #### OBS: os bancos utilizados aqui sao do 'DSR' - ja estao no formato 'tibble' ### qdo leio um banco usando 'read.csv' tenho q fazer sua coercao para o 'tibble' usando o comando 'as_tibble'