Capítulo 3 Introdução ao tidyverse
Busque mais informações sobre os pacotes que compõem o tidyverse
nas referências recomendadas.
3.1 Criando uma tibble
Uma tibble é uma tabela retangular.
-
Cada coluna é um vetor:
cores <- tibble( pessoa = c('João', 'Maria', 'Pedro', 'Ana'), 'cor favorita' = c('azul', 'rosa', 'preto', 'branco') )
cores
Isto é um pouco diferente da maneira como estamos acostumados a ver tabelas (como uma coleção de linhas, em vez de uma coleção de colunas).
-
A função
tribble
permite a entrada de forma mais natural, linha a linha. Lembre-se de usar~
antes dos nomes das colunas.cores <- tribble( ~pessoa, ~'cor favorita', "João", "azul", "Maria", "rosa", "Pedro", "preto", "Ana", "branco" )
cores
Mesmo que você crie uma tibble linha a linha, o R vai continuar tratando sua tibble como uma coleção de colunas.
É importante lembrar disto para entender a forma como R manipula estas tabelas.
-
Se uma coluna não puder ser armazenada em um vetor, a coluna será uma lista (com vetores como elementos):
cores <- tibble( pessoa = c('João', 'Maria', 'Pedro', 'Ana'), 'cor favorita' = list( c('azul', 'roxo'), c('rosa', 'magenta'), NA, 'branco' ) )
cores
-
Use
View()
para examinar interativamente o conteúdo de uma coluna-lista:
3.2 Operador de pipe (%>%
)
- O
tidyverse
inclui o pacotemagrittr
, que contém o operador%>%
, chamado pipe.1
-
A idéia é facilitar a leitura de composições de funções. O código
y <- h(g(f(x)))
pode ser escrito como
Esta segunda versão é mais fiel à ordem em que as operações acontecem.
-
Na verdade, R tem um operador de atribuição para a direita, mas poucas pessoas recomendam usá-lo:
-
Se
f
,g
eh
forem funções de um argumento só, os parênteses podem ser omitidos: -
Se a função
f
tiver outros argumentos, escreva-os normalmente na chamada af
: O pipe
EXP %>% f(...)
sempre insere o resultado da expressãoEXP
como o primeiro argumento da funçãof
.-
Se você precisar que o resultado da expressão
EXP
seja inserido em outra posição na lista de argumentos def
, use um ponto “.
” para isso:x %>% consultar(df, .)
equivale a
consultar(df, x)
3.3 Formato tidy
-
Nossa última versão da tibble
cores
é um pouco mais complexa do que deveria ser:cores
-
O formato tidy exige que
Cada linha da tibble corresponda a uma observação sobre um indivíduo,
Cada coluna corresponda a uma variável observada, e
Cada célula contenha um valor da variável.
Na tibble
cores
, a primeira e a segunda exigências são satisfeitas, mas a terceira não, pois algumas células contém valores múltiplos.A tibble não está no formato tidy.
-
Podemos “extrair” estes vetores “aninhados” usando o comando
unnest
, do pacotetidyr
:cores
A maioria das funções do
tidyverse
exige que as tibbles estejam neste formato tidy.-
Um exemplo mais complexo é o dataset
billboard
, com as seguintes colunas (para cada música que estava no top 100 da Billboard no ano de \(2000\)):Nome do artista ou banda;
Nome da música;
Data em que a música entrou no top 100 da Billboard;
-
Para cada uma das \(76\) semanas seguintes, a posição da música no top 100.
## Rows: 317 ## Columns: 79 ## $ artist <chr> "2 Pac", "2Ge+her", "3 Doors Down", "3 Doors Down", "504 Boyz"… ## $ track <chr> "Baby Don't Cry (Keep...", "The Hardest Part Of ...", "Krypton… ## $ date.entered <date> 2000-02-26, 2000-09-02, 2000-04-08, 2000-10-21, 2000-04-15, 2… ## $ wk1 <dbl> 87, 91, 81, 76, 57, 51, 97, 84, 59, 76, 84, 57, 50, 71, 79, 80… ## $ wk2 <dbl> 82, 87, 70, 76, 34, 39, 97, 62, 53, 76, 84, 47, 39, 51, 65, 78… ## $ wk3 <dbl> 72, 92, 68, 72, 25, 34, 96, 51, 38, 74, 75, 45, 30, 28, 53, 76… ## $ wk4 <dbl> 77, NA, 67, 69, 17, 26, 95, 41, 28, 69, 73, 29, 28, 18, 48, 77… ## $ wk5 <dbl> 87, NA, 66, 67, 17, 26, 100, 38, 21, 68, 73, 23, 21, 13, 45, 9… ## $ wk6 <dbl> 94, NA, 57, 65, 31, 19, NA, 35, 18, 67, 69, 18, 19, 13, 36, NA… ## $ wk7 <dbl> 99, NA, 54, 55, 36, 2, NA, 35, 16, 61, 68, 11, 20, 11, 34, NA,… ## $ wk8 <dbl> NA, NA, 53, 59, 49, 2, NA, 38, 14, 58, 65, 9, 17, 1, 29, NA, 9… ## $ wk9 <dbl> NA, NA, 51, 62, 53, 3, NA, 38, 12, 57, 73, 9, 17, 1, 27, NA, N… ## $ wk10 <dbl> NA, NA, 51, 61, 57, 6, NA, 36, 10, 59, 83, 11, 17, 2, 30, NA, … ## $ wk11 <dbl> NA, NA, 51, 61, 64, 7, NA, 37, 9, 66, 92, 1, 17, 2, 36, NA, 99… ## $ wk12 <dbl> NA, NA, 51, 59, 70, 22, NA, 37, 8, 68, NA, 1, 3, 3, 37, NA, NA… ## $ wk13 <dbl> NA, NA, 47, 61, 75, 29, NA, 38, 6, 61, NA, 1, 3, 3, 39, NA, 96… ## $ wk14 <dbl> NA, NA, 44, 66, 76, 36, NA, 49, 1, 67, NA, 1, 7, 4, 49, NA, 96… ## $ wk15 <dbl> NA, NA, 38, 72, 78, 47, NA, 61, 2, 59, NA, 4, 10, 12, 57, NA, … ## $ wk16 <dbl> NA, NA, 28, 76, 85, 67, NA, 63, 2, 63, NA, 8, 17, 11, 63, NA, … ## $ wk17 <dbl> NA, NA, 22, 75, 92, 66, NA, 62, 2, 67, NA, 12, 25, 13, 65, NA,… ## $ wk18 <dbl> NA, NA, 18, 67, 96, 84, NA, 67, 2, 71, NA, 22, 29, 15, 68, NA,… ## $ wk19 <dbl> NA, NA, 18, 73, NA, 93, NA, 83, 3, 79, NA, 23, 29, 18, 79, NA,… ## $ wk20 <dbl> NA, NA, 14, 70, NA, 94, NA, 86, 4, 89, NA, 43, 40, 20, 86, NA,… ## $ wk21 <dbl> NA, NA, 12, NA, NA, NA, NA, NA, 5, NA, NA, 44, 43, 30, NA, NA,… ## $ wk22 <dbl> NA, NA, 7, NA, NA, NA, NA, NA, 5, NA, NA, NA, 50, 40, NA, NA, … ## $ wk23 <dbl> NA, NA, 6, NA, NA, NA, NA, NA, 6, NA, NA, NA, NA, 39, NA, NA, … ## $ wk24 <dbl> NA, NA, 6, NA, NA, NA, NA, NA, 9, NA, NA, NA, NA, 44, NA, NA, … ## $ wk25 <dbl> NA, NA, 6, NA, NA, NA, NA, NA, 13, NA, NA, NA, NA, NA, NA, NA,… ## $ wk26 <dbl> NA, NA, 5, NA, NA, NA, NA, NA, 14, NA, NA, NA, NA, NA, NA, NA,… ## $ wk27 <dbl> NA, NA, 5, NA, NA, NA, NA, NA, 16, NA, NA, NA, NA, NA, NA, NA,… ## $ wk28 <dbl> NA, NA, 4, NA, NA, NA, NA, NA, 23, NA, NA, NA, NA, NA, NA, NA,… ## $ wk29 <dbl> NA, NA, 4, NA, NA, NA, NA, NA, 22, NA, NA, NA, NA, NA, NA, NA,… ## $ wk30 <dbl> NA, NA, 4, NA, NA, NA, NA, NA, 33, NA, NA, NA, NA, NA, NA, NA,… ## $ wk31 <dbl> NA, NA, 4, NA, NA, NA, NA, NA, 36, NA, NA, NA, NA, NA, NA, NA,… ## $ wk32 <dbl> NA, NA, 3, NA, NA, NA, NA, NA, 43, NA, NA, NA, NA, NA, NA, NA,… ## $ wk33 <dbl> NA, NA, 3, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,… ## $ wk34 <dbl> NA, NA, 3, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,… ## $ wk35 <dbl> NA, NA, 4, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,… ## $ wk36 <dbl> NA, NA, 5, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,… ## $ wk37 <dbl> NA, NA, 5, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,… ## $ wk38 <dbl> NA, NA, 9, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,… ## $ wk39 <dbl> NA, NA, 9, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,… ## $ wk40 <dbl> NA, NA, 15, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk41 <dbl> NA, NA, 14, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk42 <dbl> NA, NA, 13, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk43 <dbl> NA, NA, 14, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk44 <dbl> NA, NA, 16, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk45 <dbl> NA, NA, 17, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk46 <dbl> NA, NA, 21, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk47 <dbl> NA, NA, 22, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk48 <dbl> NA, NA, 24, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk49 <dbl> NA, NA, 28, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk50 <dbl> NA, NA, 33, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk51 <dbl> NA, NA, 42, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk52 <dbl> NA, NA, 42, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk53 <dbl> NA, NA, 49, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk54 <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk55 <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk56 <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk57 <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk58 <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk59 <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk60 <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk61 <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk62 <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk63 <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk64 <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk65 <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk66 <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk67 <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk68 <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk69 <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk70 <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk71 <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk72 <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk73 <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk74 <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk75 <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA… ## $ wk76 <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
-
Vamos renomear as colunas:
-
O que é uma observação neste conjunto de dados?
A posição, em uma semana, de uma música que esteve no top \(100\) da Billboard durante o ano 2000.
-
Quais são as variáveis que qualificam cada observação?
O artista,
O título da música,
A posiçao da música no top \(100\) da Billboard em cada uma das \(76\) semanas depois que ela entrou na lista.
Este último item é complexo, e o criador da tibble decidiu criar uma coluna por semana.
Uma decisão ruim, pois existe informação embutida nos nomes das colunas. A coluna
wk68
corresponde à posição da música na semana \(68\) após ela entrar na lista, mas o número da semana só aparece no nome da coluna!Isto nunca deve acontecer. A informação deve sempre estar nas células.
-
Vamos simplificar as coisas criando duas colunas:
semana
, com o número da semana; perceba que esta informação vem dos nomes das colunas,pos
, com a posição da música naquela semana; esta informação vem das células.
A tibble, que antes era larga, vai ser mais estreita e mais longa.
-
A função
pivot_longer
, do pacotetidyr
, vai fazer o trabalho — inclusive extraindo os números das semanas dos nomes das colunas:bb_tidy <- bb %>% pivot_longer( wk1:wk76, names_to = 'semana', names_prefix = 'wk', names_transform = list( semana = as.integer ), values_to = 'pos' )
bb_tidy
O R só mostra, por default, as \(1000\) primeiras linhas de uma tibble.
-
Na verdade, o número de linhas da tabela original era
## [1] 317
-
O número de linhas, depois de
pivot_longer
, ficou:## [1] 24092
Existem linhas onde
pos
tem o valorNA
. São resultado da organização original dos dados, onde oNA
indicava que a música não estava no top \(100\) naquela semana.No novo formato, a ausência da linha com aquele número de semana já basta para indicar isto. Então, vamos eliminar as linhas onde
pos
éNA
.-
A função
filter
mantém as linhas que satisfazem a condição dada; por isso, a condição é “pos
não éNA
”:bb_tidy
-
O número de linhas ficou
## [1] 5307
3.3.1 Exercícios
Todas as semanas deste conjunto de dados são do ano \(2000\)?
Qual é o tipo do primeiro argumento da função
filter()
?
3.4 Manipulando os dados
3.4.1 Criando novas colunas: mutate
, transmute
-
O data frame2
cars
tem dados (de \(1920\)!) sobre as distâncias de frenagem (em pés) de um carro viajando a diversas velocidades (em milhas por hora):cars
-
Vamos criar colunas novas com os valores convertidos para km/h e metros; além disso, uma coluna com a taxa de frenagem:
-
Perceba que as colunas antigas continuam lá. Se quiser manter apenas as colunas novas, use
transmute
:cars %>% transmute( velocidade = speed * 1.6, distancia = dist * .33, taxa = velocidade / distancia )
Ou use o argumento
.keep
demutate
para escolher com mais precisão. Veja a ajuda demutate
.
3.4.2 Selecionando colunas: select
, distinct
, pull
Vamos voltar à nossa tibble dos top \(100\) da Billboard.
-
Para ver só a coluna de artistas:
-
Para eliminar as repetições:
-
Para ver artistas e músicas:
-
Para especificar colunas a não mostrar, use o sinal de menos “
-
”: -
Para extrair uma coluna na forma de vetor (
unique
é uma função do R base, aplicável a vetores):## [1] "2 Pac" "2Ge+her" ## [3] "3 Doors Down" "504 Boyz" ## [5] "98^0" "A*Teens" ## [7] "Aaliyah" "Adams, Yolanda" ## [9] "Adkins, Trace" "Aguilera, Christina" ## [11] "Alice Deejay" "Allan, Gary" ## [13] "Amber" "Anastacia" ## [15] "Anthony, Marc" "Avant" ## [17] "BBMak" "Backstreet Boys, The" ## [19] "Badu, Erkyah" "Baha Men" ## [21] "Barenaked Ladies" "Beenie Man" ## [23] "Before Dark" "Bega, Lou" ## [25] "Big Punisher" "Black Rob" ## [27] "Black, Clint" "Blaque" ## [29] "Blige, Mary J." "Blink-182" ## [31] "Bloodhound Gang" "Bon Jovi" ## [33] "Braxton, Toni" "Brock, Chad" ## [35] "Brooks & Dunn" "Brooks, Garth" ## [37] "Byrd, Tracy" "Cagle, Chris" ## [39] "Cam'ron" "Carey, Mariah" ## [41] "Carter, Aaron" "Carter, Torrey" ## [43] "Changing Faces" "Chesney, Kenny" ## [45] "Clark Family Experience" "Clark, Terri" ## [47] "Common" "Counting Crows" ## [49] "Creed" "Cyrus, Billy Ray" ## [51] "D'Angelo" "DMX" ## [53] "Da Brat" "Davidson, Clay" ## [55] "De La Soul" "Destiny's Child" ## [57] "Diffie, Joe" "Dion, Celine" ## [59] "Dixie Chicks, The" "Dr. Dre" ## [61] "Drama" "Dream" ## [63] "Eastsidaz, The" "Eiffel 65" ## [65] "Elliott, Missy \"Misdemeanor\"" "Eminem" ## [67] "En Vogue" "Estefan, Gloria" ## [69] "Evans, Sara" "Eve" ## [71] "Everclear" "Fabian, Lara" ## [73] "Fatboy Slim" "Filter" ## [75] "Foo Fighters" "Fragma" ## [77] "Funkmaster Flex" "Ghostface Killah" ## [79] "Gill, Vince" "Gilman, Billy" ## [81] "Ginuwine" "Goo Goo Dolls" ## [83] "Gray, Macy" "Griggs, Andy" ## [85] "Guy" "Hanson" ## [87] "Hart, Beth" "Heatherly, Eric" ## [89] "Henley, Don" "Herndon, Ty" ## [91] "Hill, Faith" "Hoku" ## [93] "Hollister, Dave" "Hot Boys" ## [95] "Houston, Whitney" "IMx" ## [97] "Ice Cube" "Ideal" ## [99] "Iglesias, Enrique" "J-Shin" ## [101] "Ja Rule" "Jackson, Alan" ## [103] "Jagged Edge" "Janet" ## [105] "Jay-Z" "Jean, Wyclef" ## [107] "Joe" "John, Elton" ## [109] "Jones, Donell" "Jordan, Montell" ## [111] "Juvenile" "Kandi" ## [113] "Keith, Toby" "Kelis" ## [115] "Kenny G" "Kid Rock" ## [117] "Kravitz, Lenny" "Kumbia Kings" ## [119] "LFO" "LL Cool J" ## [121] "Larrieux, Amel" "Lawrence, Tracy" ## [123] "Levert, Gerald" "Lil Bow Wow" ## [125] "Lil Wayne" "Lil' Kim" ## [127] "Lil' Mo" "Lil' Zane" ## [129] "Limp Bizkit" "Lonestar" ## [131] "Lopez, Jennifer" "Loveless, Patty" ## [133] "Lox" "Lucy Pearl" ## [135] "Ludacris" "M2M" ## [137] "Madison Avenue" "Madonna" ## [139] "Martin, Ricky" "Mary Mary" ## [141] "Master P" "McBride, Martina" ## [143] "McEntire, Reba" "McGraw, Tim" ## [145] "McKnight, Brian" "Messina, Jo Dee" ## [147] "Metallica" "Montgomery Gentry" ## [149] "Montgomery, John Michael" "Moore, Chante" ## [151] "Moore, Mandy" "Mumba, Samantha" ## [153] "Musiq" "Mya" ## [155] "Mystikal" "N'Sync" ## [157] "Nas" "Nelly" ## [159] "Next" "Nine Days" ## [161] "No Doubt" "Nu Flavor" ## [163] "Offspring, The" "Paisley, Brad" ## [165] "Papa Roach" "Pearl Jam" ## [167] "Pink" "Price, Kelly" ## [169] "Profyle" "Puff Daddy" ## [171] "Q-Tip" "R.E.M." ## [173] "Rascal Flatts" "Raye, Collin" ## [175] "Red Hot Chili Peppers" "Rimes, LeAnn" ## [177] "Rogers, Kenny" "Ruff Endz" ## [179] "Sammie" "Santana" ## [181] "Savage Garden" "SheDaisy" ## [183] "Sheist, Shade" "Shyne" ## [185] "Simpson, Jessica" "Sisqo" ## [187] "Sister Hazel" "Smash Mouth" ## [189] "Smith, Will" "Son By Four" ## [191] "Sonique" "SoulDecision" ## [193] "Spears, Britney" "Spencer, Tracie" ## [195] "Splender" "Sting" ## [197] "Stone Temple Pilots" "Stone, Angie" ## [199] "Strait, George" "Sugar Ray" ## [201] "TLC" "Tamar" ## [203] "Tamia" "Third Eye Blind" ## [205] "Thomas, Carl" "Tippin, Aaron" ## [207] "Train" "Trick Daddy" ## [209] "Trina" "Tritt, Travis" ## [211] "Tuesday" "Urban, Keith" ## [213] "Usher" "Vassar, Phil" ## [215] "Vertical Horizon" "Vitamin C" ## [217] "Walker, Clay" "Wallflowers, The" ## [219] "Westlife" "Williams, Robbie" ## [221] "Wills, Mark" "Worley, Darryl" ## [223] "Wright, Chely" "Yankee Grey" ## [225] "Yearwood, Trisha" "Ying Yang Twins" ## [227] "Zombie Nation" "matchbox twenty"
3.4.3 Filtrando linhas: filter
, slice
-
Apenas as músicas da Britney Spears:
-
Apenas músicas que chegaram à posição \(1\), sem mostrar a coluna
pos
: -
Apenas músicas que chegaram à posição \(1\) em menos de \(10\) semanas, mostrando apenas artista e música:
As funções da família
slice
filtram linhas de diversas maneiras.-
De acordo com seus índices (números de linha):
bb_tidy %>% slice_head(n = 4)
bb_tidy %>% slice_tail(n = 4)
-
De acordo com a ordenação de uma coluna ou de uma função das colunas:
-
Aleatoriamente, criando uma amostra:
bb_tidy %>% slice_sample(n = 5)
-
Veja a ajuda de
slice
para saber mais sobre estas funções. Por exemplo:slice_min
eslice_max
podem considerar ou não empates.Você pode especificar uma proporção de linhas (usando
prop
) em vez da quantidade de linhas (n
).Você pode fazer amostragem com reposição, ou com probabilidades diferentes para cada linha.
3.4.4 Ordenando linhas: arrange
-
Por título, sem repetições:
-
Por título, sem repetições, em ordem inversa:
3.4.5 Contando linhas: count
-
Quantas semanas cada artista ficou nos top \(100\)? Duas músicas na mesma semana contam como duas semanas.
-
Quantas semanas cada música ficou nos top \(100\)?
-
Se houve músicas com o mesmo nome, mas de artistas diferentes, o código acima está errado. O certo é
De fato, há uma diferença de uma linha.
3.4.6 Agrupando linhas: group_by
e summarize
-
Qual foi a melhor posição que cada artista alcançou?
-
Qual foi a melhor posição que cada música alcançou?
## `summarise()` has grouped output by 'artista'. You can override using the ## `.groups` argument.
Quando usamos
summarize
, só o agrupamento mais interno é desfeito. Isto significa que o resultado acima ainda está agrupado porartista
.-
Quantas semanas cada artista ficou na posição \(1\)?
A função
n()
é uma maneira conveniente de obter o número de linhas de um grupo (ou, se não houver agrupamento, de toda a tibble); masn()
só pode ser chamada em certos contextos, comosummarise()
oumutate()
.bb_tidy %>% filter(pos == 1) %>% group_by(artista) %>% summarize(semanas = n()) %>% arrange(desc(semanas))
-
Perceba que
count
, que vimos mais acima, faz agrupamentos do mesmo modo: -
Uma pergunta diferente: quais são os artistas cujas músicas apareceram no top \(100\) mais tempo depois do lançamento da música?
-
Qual a posição média de cada música? Lembre-se de que eliminamos as linhas com
NA
; logo, a média vai ser sobre a quantidade de semanas em que a música esteve na lista.media1 <- bb_tidy %>% group_by(artista, musica) %>% summarize(media = mean(pos), .groups = 'drop') %>% arrange(media)
media1
-
E se quisermos a média sobre o número de semanas desde a entrada da música até a última semana em que a música apareceu na lista?
media2 <- bb_tidy %>% group_by(artista, musica) %>% summarize(media = sum(pos)/max(semana), .groups = 'drop') %>% arrange(media)
media2
As primeiras linhas são iguais, mas os resultados são diferentes:
identical(media1, media2)
## [1] FALSE
3.5 Exercícios
-
Vamos trabalhar com um conjunto de dados sobre super-heróis.
Carregue o
tidyverse
com o comandoExecute o seguinte comando para ler os dados para uma tibble:
arquivo <- paste0( 'https://github.com/fnaufel/', 'probestr/raw/master/data/', 'heroes_information.csv' ) herois_info <- read_csv( arquivo, na = c('', '-', 'NA') ) %>% # Eliminar a primeira coluna (números de série) select(-1) %>% # Renomear colunas restantes rename( nome = name, sexo = Gender, olhos = 'Eye color', raça = Race, cabelos = 'Hair color', altura = Height, editora = Publisher, pele = 'Skin color', lado = Alignment, peso = Weight )
-
Quantas linhas tem a tibble?
-
Existem heróis que aparecem em mais de uma linha?
-
Quantas editoras diferentes existem na tibble? Liste-as em ordem decrescente de quantidade de heróis.
-
Vamos colocar todas as editores menores em uma classe só.
Na coluna
editora
, substitua- ‘Marvel Comics’ por ‘Marvel’,
- ‘DC Comics’ por ‘DC’, e
- todas as outras editoras pelo termo ‘Outras’.
Dica: use a função
case_when()
, dotidyverse
. -
Confira, novamente, a quantidade de valores diferentes na coluna
editora
. -
Existem heróis sem informação de editora. Quantos? Quais são?
-
Altere novamente a coluna
editora
, colocando o valor ‘Outras’ para os heróis sem informação de editora. Use a funçãoif_else()
(com underscore, não a funçãoifelse
). -
Confira, mais uma vez, a quantidade de valores diferentes na coluna
editora
. -
Existem heróis sem informação de sexo? Quantos? Para estes heróis, coloque o valor ‘Desconhecido’ na coluna
sexo
. -
Qual a altura mínima? Qual a altura máxima? Substitua as alturas negativas por
NA
. -
Qual o peso mínimo? Qual o peso máximo? Substitua os pesos negativos por
NA
. -
Qual é o peso médio de todos os heróis? Ignore os valores
NA
. -
Qual é a altura média de todos os heróis? Ignore os valores
NA
. -
Qual é a altura média dos heróis, por editora? Ignore os valores
NA
. -
Quais são os \(3\) heróis mais altos de cada sexo?
-
Quais são as \(3\) cores de olhos mais comuns para cada sexo?
-
Liste, por editora, as quantidades de heróis do bem, do mal, e neutros.
-
Quantas raças diferentes existem?
-
Qual a quantidade de raças diferentes de cada editora?
-
DESAFIO: Liste as raças que só pertencem a uma única editora.
Existem várias maneiras de fazer isto. Experimente várias, até achar uma que seja mais elegante.
3.6 Examinando tibbles intermediárias
O pacote
ViewPipeSteps
serve para exibir (no console ou em tabs no RStudio) as tibbles que são resultados de cada passo em uma sequência de comandos montada com o pipe%>%
.-
Instale o pacote com o comando
install.packages("ViewPipeSteps")
-
Carregue o pacote com
library(ViewPipeSteps)
-
Para exibir, no console, as tibbles intermediárias, acrescente
print_pipe_steps(all = TRUE)
após o último passo do pipe:resultado <- bb_tidy %>% group_by(artista, musica) %>% summarize(media = sum(pos)/max(semana), .groups = 'drop') %>% arrange(media) %>% print_pipe_steps(all = TRUE)
## 1. bb_tidy
## # A tibble: 5.307 × 5 ## artista musica entrou semana pos ## <chr> <chr> <date> <int> <dbl> ## 1 2 Pac Baby Don't Cry (Keep... 2000-02-26 1 87 ## 2 2 Pac Baby Don't Cry (Keep... 2000-02-26 2 82 ## 3 2 Pac Baby Don't Cry (Keep... 2000-02-26 3 72 ## 4 2 Pac Baby Don't Cry (Keep... 2000-02-26 4 77 ## 5 2 Pac Baby Don't Cry (Keep... 2000-02-26 5 87 ## 6 2 Pac Baby Don't Cry (Keep... 2000-02-26 6 94 ## # ℹ 5.301 more rows
## 2. group_by(artista, musica)
## # A tibble: 5.307 × 5 ## artista musica entrou semana pos ## <chr> <chr> <date> <int> <dbl> ## 1 2 Pac Baby Don't Cry (Keep... 2000-02-26 1 87 ## 2 2 Pac Baby Don't Cry (Keep... 2000-02-26 2 82 ## 3 2 Pac Baby Don't Cry (Keep... 2000-02-26 3 72 ## 4 2 Pac Baby Don't Cry (Keep... 2000-02-26 4 77 ## 5 2 Pac Baby Don't Cry (Keep... 2000-02-26 5 87 ## 6 2 Pac Baby Don't Cry (Keep... 2000-02-26 6 94 ## # ℹ 5.301 more rows
## 3. summarize(media = sum(pos)/max(semana), .groups = "drop")
## # A tibble: 317 × 3 ## artista musica media ## <chr> <chr> <dbl> ## 1 2 Pac Baby Don't Cry (Keep... 85.4 ## 2 2Ge+her The Hardest Part Of ... 90 ## 3 3 Doors Down Kryptonite 26.5 ## 4 3 Doors Down Loser 67.1 ## 5 504 Boyz Wobble Wobble 56.2 ## 6 98^0 Give Me Just One Nig... 37.6 ## # ℹ 311 more rows
## 4. arrange(media)
## # A tibble: 317 × 3 ## artista musica media ## <chr> <chr> <dbl> ## 1 "Santana" Maria, Maria 10.5 ## 2 "Madonna" Music 13.5 ## 3 "N'Sync" Bye Bye Bye 14.3 ## 4 "Elliott, Missy \"Misdemeanor\"" Hot Boyz 14.3 ## 5 "Destiny's Child" Independent Women Pa... 14.8 ## 6 "Iglesias, Enrique" Be With You 15.8 ## # ℹ 311 more rows
Para exibir as tibbles intermediárias em tabs do RStudio (como com a função
View()
), você pode usar o addinviewPipeChain
, que também faz parte deste pacote. Veja o exemplo no site do pacote.