# library(dplyr) # library(tidyr) # library(pander) # # data(pnud_muni, package = 'abjutils') # names(pnud_muni)[names(pnud) %>% stringr::str_detect("(Muni)?(pio)")] <- "municipio" library(magrittr) library(tidyr) library(mcUFSCar2015)
%>%
)%>%
usa o resultado do seu lado esquerdo "Só" isso!
Para usar o operador %>%
:
install.packages("magrittr")
library(magrittr)
%>%
{.build}x <- c(1,2,3,4) x %>% sum %>% sqrt sqrt(sum(x))
esfrie(asse(coloque(bata(acrescente(recipiente( rep("farinha", 2), "água", "fermento", "leite", "óleo"), "farinha", até = "macio"), duração = "3min"), lugar = "forma", tipo = "grande", untada = T), duração = "50min"), "geladeira", "20min")
recipiente(rep("farinha", 2), "água", "fermento", "leite", "óleo") %>% acrescente("farinha", até = "macio") %>% bata(duração = "3min") %>% coloque(lugar = "forma", tipo = "grande", untada = T) %>% asse(duração = "50min") %>% esfrie("geladeira", "20min")
%>%
com .
TRUE %>% mean(c(NA, 1:101), na.rm = .) FALSE %>% mean(c(NA, 1:101), na.rm = .)
TRUE %>% mean(c(NA, 1:101), na.rm = .)
,
começando com 1:101
.1:101 %>% c(NA) %>% mean(na.rm = TRUE)
{}
- Não passa o argumento implicitamente1:10 %>% c(min(.), max(.)) 1:10 %>% { c(min(.), max(.)) } 1:10 %>% { c() }
{}
- Já assume que primeiro parâmetro = .
1:4 %>% sum 1:4 %>% sum() 1:4 %>% sum(.)
1:4 %>% sum(1:4) 1:4 %>% sum(1:4, .) 1:4 %>% sum(., 1:4, .)
m1 <- mtcars %>% { .$cyl2 <- .$cyl ^ 2 lm(mpg ~ cyl2, data = .) } mtcars$cyl2 <- mtcars$cyl ^ 2 m2 <- lm(mpg ~ cyl2, data = mtcars) list(m1, m2) %>% lapply(coef)
“(...) The fact that data science exists as a field is a colossal failure of statistics. To me, [what I do] is what statistics is all about. It is gaining insight from data using modelling and visualization. Data munging and manipulation is hard and statistics has just said that’s not our domain.”
Hadley Wickham
dplyr
é um dos pacotes mais úteis para manipulação de dados.%>%
.R
.library(dplyr) # mensagens de warning chatas
cdg %>% tbl_df
select
filter
mutate
arrange
summarise
data.frame
(tbl
), e o output é sempre um data.frame
(tbl
).data.frame
, e nos outros argumentos colocamo o que queremos fazer.C
e C++
por trás da maioria das funções, o que geralmente torna o código mais eficiente.data.table
.starts_with(x)
, contains(x)
, matches(x)
, one_of(x)
, etc.:
.-
.# especificando nomes (maneira mais usual) cdg %>% select(mandante, placar, visitante)
# por indice (nao recomendavel!) cdg %>% select(1:5)
# intervalos e funcoes auxiliares (para economizar trabalho) cdg %>% select(ano, placar, starts_with('p_'), -p_vitorioso)
Selecione ano, todas as variáveis relacionadas ao mandante e todas as variáveis relacionadas ao visitante
subset
.&
.# somente Bahia como mandante, ano maior que 2005 cdg %>% select(ano, mandante) %>% filter(mandante == 'Bahia', ano > 2005)
# mesma coisa que o anterior pnud_muni %>% select(ano, ufn, municipio, idhm) %>% filter(mandante == 'Bahia' & ano > 2005)
cdg %>% select(mandante, placar, visitante) %>% filter(placar != '0x0')
# %in% cdg %>% select(mandante, placar, visitante) %>% filter(mandante %in% c('São Paulo', 'Palmeiras', 'Corinthians'))
Seleciona ano, mandante, placar e visitante e depois filtre para jogos que envolveram somente os times Internacional e Santos, que tiveram placar de 3x0 ou 0x3
transform
, mas aceita várias novas colunas iterativamente.length
que o nrow
do bd oridinal ou 1
.# media de idhm_l e idhm_e cdg %>% select(ano, mandante:visitante) %>% mutate(gols_mandante = as.numeric(str_sub(placar, 1, 1)), gols_visitante = as.numeric(str_sub(placar, 3, 3)))
# errado cdg %>% select(ano, mandante:visitante) %>% mutate(gols_mandante = as.numeric(str_sub(placar, 1, 1)), gols_visitante = as.numeric(str_sub(placar, 3, 3)), total_gols = sum(gols_mandante, gols_visitante)) # correto cdg %>% select(ano, mandante:visitante) %>% mutate(gols_mandante = as.numeric(str_sub(placar, 1, 1)), gols_visitante = as.numeric(str_sub(placar, 3, 3)), total_gols = gols_mandante + gols_visitante)
tidyr::separate
# media de idhm_l e idhm_e cdg %>% select(ano, mandante:visitante) %>% separate(placar, c('gols_mandante', 'gols_visitante'), sep = 'x', remove = FALSE, convert = TRUE)
Selecione ano, mandante, placar, visitante e as probabilidades dos resultados no
ano de 2011. Verifique quais as probabilidades não têm soma 100.
Dica: usar tidyr::extract_numeric
.
desc
para ordem decrescente.cdg %>% select(ano, mandante:visitante, p_vitorioso) %>% filter(ano == 2010) %>% mutate(p_vitorioso_num = extract_numeric(p_vitorioso)) %>% arrange(p_vitorioso_num)
cdg %>% select(ano, mandante:visitante, p_vitorioso) %>% filter(ano == 2010) %>% mutate(p_vitorioso_num = extract_numeric(p_vitorioso)) %>% arrange(desc(p_vitorioso_num))
Selecione somente ano, mandante, placar, visitante. Filtre para ano de 2012. Ordene por mandante e visitante.
1
a partir de uma conta com as variáveis.group_by
.n()
, n_distinct()
.cdg %>% select(ano, mandante:visitante) %>% mutate(gols_mandante = as.numeric(str_sub(placar, 1, 1)), gols_visitante = as.numeric(str_sub(placar, 3, 3)), total_gols = gols_mandante + gols_visitante) %>% group_by(ano) %>% summarise(total = sum(total_gols), media = mean(total_gols))
cdg %>% count(mandante, ano)
cdg %>% group_by(mandante, ano) %>% summarise(n = n())
Faça uma tabela descritiva da distribuição do número de gols em cada ano.
library(tidyr)
comparacao <- cdg %>% select(ano, mandante:visitante) %>% filter(mandante %in% c('Corinthians', 'Vasco') | visitante %in% c('Corinthians', 'Vasco')) %>% separate(placar, c('gols_mandante', 'gols_visitante'), sep = 'x', remove = TRUE, convert = TRUE) %>% group_by(ano) %>% summarise(corinthians = sum(gols_mandante[mandante == 'Corinthians']), corinthians = corinthians + sum(gols_visitante[visitante == 'Corinthians']), vasco = sum(gols_mandante[mandante == 'Vasco']), vasco = vasco + sum(gols_visitante[visitante == 'Vasco'])) comparacao
comparacao %>% gather(time, gols, -ano)
comparacao %>% gather(time, gols, -ano) %>% spread(ano, gols)
Verifique se gather(spread(dados))
, spread(gather(dados))
e dados
são equivalentes.
unite
junta duas ou mais colunas usando algum separador (_
, por exemplo).separate
faz o inverso de unite
, e uma coluna em várias usando um separador.library(lubridate) cdg %>% mutate(data_jogo = ifelse(ano < 2007, sprintf('%s/%s', data_jogo, ano), data_jogo), data_jogo = as.Date(dmy(data_jogo))) %>% filter(month(data_jogo) == 12)
cdg %>% filter(mandante != '') %>% select(mandante:visitante) %>% separate(placar, c('gols_mandante', 'gols_visitante'), sep = 'x', remove = TRUE, convert = TRUE) %>% unite(mandante_u, mandante, gols_mandante, sep = '_') %>% unite(visitante_u, visitante, gols_visitante, sep = '_') %>% gather() %>% separate(value, c('time', 'gols'), sep = '_', convert = TRUE) %>% group_by(time) %>% summarise(n_jogos = n(), media = mean(gols), desv_pad = sd(gols)) %>% arrange(desc(media))
inner_join
, left_join
, anti_join
etc.min_rank
, percent_rank
etc.do
.distinct
.stringr
para trabalhar com textos.lubridate
para trabalhar com datas.httr
, xml2
e rvest
foram usados para baixar os dados da web.Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.