Tidyverse
O que é e história
O tidyverse é um metapacote, ou conjunto de pacotes. Pode-se pensar no tidyverse como uma família de pacotes, unidos por uma filosofia comum; grosso modo, os pacotes que compõem o tidyverse tem o mesmo objetivo: facilitar a manipulação de dados.
Estes pacotes criaram uma nova forma de se escrever código, que substitui boa parte ou mesmo todas as funções do base-R. Atualmente, o tidyverse parece estar se consolidando como a variante dominante do R. De fato, a maior parte dos pacotes do tidyverse consta na lista dos mais baixados no repositório CRAN.
Glossário
‘Base-R’ ou ‘R-base’: nome dado às funções e pacotes que sempre vem carregadas junto com o R. Ex: plot()
, str()
, {stats}
, {utils}
.
O tidyverse é intimamente ligado com o estatístico Hadley Wickham, criador ou co-criador da maioria dos seus pacotes, e autor do influente artigo em que ele define o que é “tidy” data. Ele também é autor de diversos livros didáticos como R for Data Science e ggplot2: Elegant graphics for Data Analysis, que ajudaram a popularizar o tidyverse.
Na definição de Wickham, dados limpos ou tidy data possuem três características centrais:
- Cada variável é uma coluna; toda coluna é uma variável.
- Cada observação é uma linha; toda linha é uma observação.
- Cada valor é uma célula; toda célula é um único valor.
Wickham também tem posição de liderança dentro da Posit (antigamente conhecida como RStudio), que mantém o GUI mais popular de R e que patrocina inúmeras atividades vinculadas com o aprendizado de R, que costumam enfatizar os pacotes do tidyverse. De fato, tornou-se lugar comum começar a se ensinar R pelo tidyverse como se vê pela prevalência de cursos no Coursera ou Datacamp.
Quando se olha para a curta história do tidyverse é difícil explicar o porquê do seu enorme sucesso, mas é fato que este conjunto de pacotes se tornou um dialeto dominante dentro da comunidade do R. As funções do tidyverse tem algumas vantagens importantes sobre o base-R.
Diferenciais do tidyverse
Consistência e qualidade
As funções do tidyverse possuem uma característica ausente na maior parte das funções base do R: consistência. As funções do tidyverse oferecem consistência sintática: o nome das funções segue certas convenções e a ordem dos argumentos segue regras previsíveis.
Um exemplo imediato é o pacote stringr
, que serve para manipulação de strings. Todas as funções deste pacote começam com prefixo str_
e seus argumentos seguem a lógica: string
e pattern
como em str_detect(string, pattern)
1. Além disso, as funções são mais otimizadas em relação às funções base do R.
O purrr
faz algo similar, ao simplificar a família de funções apply
em diversas funções map_*
. Neste caso, além da consistência sintática, as funções map_*
também garantem a consistência do output, em termos da classe do objeto que é retornado como resultado da função. Isto é uma grande vantagem, especialmente quando comparado com a função sapply
que “simplifica” o output de maneiras às vezes imprevisíveis.
Em termos de eficiência, o tidyverse costuma ganhar das funções equivalentes em base-R. O dplyr
/tidyr
, de maneira geral, garante manipulações de dados muito mais velozes2, assim como o readr
importa dados mais rapidamente3. As funções map
também tem paralelos simples na família future_
do pacote furrr
, que permite usar processamento paralelo no R.
Material de apoio
Há muito material de apoio para tidyverse: livros, materiais didáticos, posts em blogs, respostas em fóruns, etc. Como citado acima, o próprio Posit produz inúmeros materiais didáticos e livros que ajudam a aprender e a ensinar tidyverse. Na medida em que o tidyverse consolida-se como o dialeto dominante isto tende a se tornar um ciclo virtuoso.
O R é uma linguagem bastante versátil, que reúne pesquisadores de campos distintos. Recentemente, parece haver uma convergência para o tidyverse. O campo de séries de tempo, por exemplo, agora tem o tidyquant
, fable
e modeltime
que utilizam os princípios do tidyverse
. Com o tempo, deve-se observar movimentos similares de outros campos.
Ganhos de aprendizado
O conhecimento no R muitas vezes é bastante horizontal. Cada pacote novo traz funções diferentes, seguindo lógicas distintas, forçando o usuário a “começar do zero” várias vezes.
O tidyverse
tenta resolver esse problema, oferecendo uma sintaxe geral que permite que os usuários aprendam uma lógica geral de manipulação de dados.
A sintaxe do pacote dplyr
serve para diferentes contextos. O dbplyr
, por exemplo, é um backend para databases (como BigQuery, PostgreSQL, etc.) que usa a sintaxe do dplyr
como frontend. O mesmo acontece com dtplyr
/tidytable
que permite usar a sintaxe do dplyr
junto com a eficiência do data.table
. Até para dados complexos já existe o pacote srvyr
que usa o survey
como backend.
Tudo em um
O tidyverse oferece funções que se aplicam a cada uma das etapas de uma análise de dados. Neste sentido, ele vai de ponta-a-ponta, cobrindo importação, limpeza, modelagem e visualização de dados. A natureza autocontida do tidyverse é bastante atraente pois oferece um caminho seguro para novatos no R, especialmente para quem tem interesse em ciência de dados.
Facilidade de uso
Este último ponto é bastante mais contencioso. Eu acredito que o tidyverse
é mais fácil do que base-R. A lógica do tidyverse
de usar o nome das colunas de um data.frame
como objetos é muito poderosa e intuitiva. Não só torna o código mais legível como também evita uma sintaxe carregada com operadores estranhos como $
.
A integração com pipes também simplifica muito o workflow da análise de dados. Com o tempo, a leitura de um código em pipes torna-se natural.
Por fim, fazer funções com tidyverse também é muito fácil. Especialmente no caso de funções simples, a sintaxe {x}
e !!x
simplifica o trabalho de programar funções com argumentos dinâmicos.
Footnotes
As funções base
gsub
,grep
egrepl
, por exemplo seguem o padrãopattern
,string
. Já a funçãostrsub
usa o padrãostring
,pattern
. Para mais diferenças entre as funções base para manipulação de texto e ostringr
consulte este material.↩︎Existem diversos benchmarks que atestam os ganhos do
dplyr
em relação ao base-R. Veja, por exemplo, este comparativo. Apesar disto, odplyr
é menos eficiente que seu concorrentedata.table
. Existem algumas alternativas como dtplyr e, mais recentemente, tidytable, que fornecem a velocidade do data.table com a sintaxe dodplyr
.↩︎Similarmente ao
dplyr
, oreadr
também perde para seu concorrentedata.table::fread
. Contudo, o pacotevroom
oferece uma alternativa mais veloz aoreadr
dentro do universo tidyverse.↩︎