Funções Mais Comuns

Preparando os Dados

Geralmente, é necessário realizar preparações nos dados antes de executar etapas de análise. Essas etapas são frequentemente de grande importância e também bastante demoradas.

Existem alguns pacotes que permitem a manipulação de conjuntos de dados. Um dos pacotes mais conhecidos e frequentemente utilizado devido à sua compreensibilidade é o dplyr. A ideia por trás do dplyr é que ele processa apenas tabelas (data frames ou tibbles) e facilita o processamento através do chamado pipe. O código no dplyr é encadeado em uma longa sequência, o que pode parecer desnecessário a princípio. No entanto, isso torna o código legível e é necessário aprender apenas algumas funções que podem representar as etapas de processamento mais comuns quando combinadas. Com essa divisão em etapas menores, cada função tem um escopo bem definido e é facilmente compreensível. Ao combinar várias funções, também é possível realizar etapas mais complexas. Além disso, as funções do pacote dplyr sempre retornam um tibble (tabela).

A extensa documentação do dplyr pode ser encontrada aqui.

Funções Mais Comuns

As funções mais comuns utilizadas com o dplyr são as seguintes:

Funktion Operation
select() Spalte(n) wählen
slice() Zeile(n) wählen
filter() Zeile(n) filtern
arrange() Zeile(n) ordnen
mutate() neue Spalten / Variablen
summarize() Werte zusammenfassen
group_by() gruppieren

Estas serão apresentadas passo a passo, antes de aprendermos sobre o piping, o segundo princípio do dplyr. Estes exemplos são de certa forma artificiais, pois o dplyr é quase exclusivamente utilizado com piping. No entanto, para entender as funções, é útil conhecê-las antecipadamente.

Em todos os exemplos, utilizamos um conjunto de dados fictício que questionou a motivação dos estudantes das universidades de Gießen, Marburg e Frankfurt.

Uma visão geral do conjunto de dados está disponível aqui:

No conjunto de dados, foram questionados, entre outros, a satisfação com a democracia (stfdem), o distrito (district), a confiança no parlamento (trstprl) e o gênero (gndr).

O package dplyr pode ser carregado individualmente, mas é recomendável carregar o package tidyverse, que carrega diretamente outros pacotes como ggplot2.

# install.packages(
#   "tidyverse", 
#   dependencies = TRUE
# )
library("tidyverse")

select()

Com a função select(), é possível selecionar uma ou várias colunas de um conjunto de dados. A saída é sempre um tibble.

No exemplo, queremos visualizar apenas as variáveis gênero (gndr) e distrito (district).

head(pss)
##    idno   district   gndr agea         edu wkhtot     income stfdem stfeco
## 1 10000 Distrikt 1   male   41 ES-ISCED IV     34 7th decile      7      6
## 2 10001 Distrikt 1   male   65 ES-ISCED II     20 6th decile      8      7
## 3 10002 Distrikt 1   male   48 ES-ISCED IV     27 7th decile      6      6
## 4 10003 Distrikt 1 female   49  ES-ISCED V     30 6th decile      5      4
## 5 10004 Distrikt 1 female   48 ES-ISCED IV     29 5th decile      4      5
## 6 10005 Distrikt 1 female   64  ES-ISCED V     30 6th decile      6      6
##   trstprl trstprt trstplt trstlgl lrscale
## 1       3       5       4       6       4
## 2       5       5       5       4       3
## 3       4       4       6       5       6
## 4       2       7       4       3       6
## 5       6       6       6       6       2
## 6       1       3       2       4       7
select(
  pss,
  c(
    gndr, 
    district
  )
)

slice()

Por outro lado, com slice(), podemos exibir linhas individuais. Por exemplo, as linhas de \(50\) a \(55\) ou em combinação com a função seq(), a cada \(100.\) linha.

slice(
  pss,
  50:55
)
##    idno   district   gndr agea          edu wkhtot     income stfdem stfeco
## 1 10049 Distrikt 1 female   65  ES-ISCED II     30 4th decile      5      7
## 2 10050 Distrikt 1 female   47  ES-ISCED IV     30 5th decile      5      2
## 3 10051 Distrikt 1 female   57 ES-ISCED III     21 5th decile      4      5
## 4 10052 Distrikt 1   male   42  ES-ISCED IV     27 9th decile      3      5
## 5 10053 Distrikt 1 female   47 ES-ISCED III     38 5th decile      5      5
## 6 10054 Distrikt 1 female   43 ES-ISCED III     42 2nd decile     10      6
##   trstprl trstprt trstplt trstlgl lrscale
## 1       6       5       6       7       7
## 2       2       5       7       4       5
## 3       5       6       2       4       3
## 4       5       4       5       5       5
## 5       4       3       0       5       2
## 6       8       5       7       4       3
slice(
  pss, 
  seq(
    0, 
    1000,
    100
  )
)
##     idno   district   gndr agea          edu wkhtot     income stfdem stfeco
## 1  10099 Distrikt 1 female   53         <NA>     41 7th decile      5      6
## 2  10199 Distrikt 1   male   58 ES-ISCED III     39 5th decile      6      5
## 3  10299 Distrikt 1 female   45 ES-ISCED III     29 5th decile      4      6
## 4  10399 Distrikt 1 female   63 ES-ISCED III     37 5th decile      7      6
## 5  10499 Distrikt 1 female   56  ES-ISCED IV     38 6th decile      5      5
## 6  10600 Distrikt 1   male   71  ES-ISCED II     44 5th decile      7      7
## 7  10700 Distrikt 1   male   70 ES-ISCED III     30 6th decile      4      6
## 8  10800 Distrikt 1   male   75  ES-ISCED II     48 5th decile      8      6
## 9  10900 Distrikt 1   male   67  ES-ISCED II     48 3rd decile      4      4
## 10 11000 Distrikt 1 female   69 ES-ISCED III     41 5th decile      4      5
##    trstprl trstprt trstplt trstlgl lrscale
## 1        1       4       4       8       8
## 2        6       4       4       5       8
## 3        7       3       6       2       5
## 4        4       5       6       6       8
## 5        3       5       4       7       6
## 6        5       4       4       4       7
## 7        3       7       7       3       8
## 8        5      10       4       5       6
## 9        3       3       4       3       5
## 10       6       3       5       4       7

filter()

Além da seleção de linhas (casos) ou colunas (variáveis) específicas, podemos restringir o conjunto de dados com filter(). Por exemplo, podemos exibir apenas os casos que vivem no Distrito 1.

filter(
  pss, 
  district == "Distrikt 1"
)

Também podemos introduzir várias condições. Por exemplo, apenas pessoas que vivem no Distrito 5 e são do sexo masculino (male).

filter(
  pss,
  district == "Distrikt 5" & gndr == "male"
)

Todas as conexões lógicas conhecidas funcionam aqui também. Como lembrete, aqui estão os conectores lógicos novamente:

  • e lógico: &

  • ou lógico: |

  • igual a lógico: ==

  • diferente de lógico: !=

  • maior que lógico: >

  • menor que lógico: <

  • menor ou igual a lógico: <=

  • maior ou igual a lógico: >=

arrange()

Para ordenar conjuntos de dados, a função arrange() pode ser usada. Aqui, você pode ordenar de forma ascendente ou descendente. Por exemplo, por horas de trabalho:

pssAsc <- arrange(
  pss, 
  wkhtot
)
head(pssAsc)
##    idno   district   gndr agea         edu wkhtot     income stfdem stfeco
## 1 20438 Distrikt 5   male   37 ES-ISCED II      6 6th decile      4      4
## 2 10078 Distrikt 1   male   54 ES-ISCED IV      7 9th decile      6      4
## 3 20249 Distrikt 5   male   48 ES-ISCED IV      7 9th decile      5      5
## 4 10072 Distrikt 1   male   52 ES-ISCED IV      8 9th decile      2      5
## 5 10757 Distrikt 1   male   37 ES-ISCED IV      9 8th decile      4      5
## 6 20103 Distrikt 5 female   25 ES-ISCED IV      9 6th decile      3      0
##   trstprl trstprt trstplt trstlgl lrscale
## 1       6       5       4       3       3
## 2       1       7       3       7       9
## 3       4       5       4       6       6
## 4       3       1       4       2       7
## 5       4       6       4       5       7
## 6       1       5       3       4       1

Usando a função desc() dentro de arrange(), os casos são classificados em ordem decrescente. desc significa descending, ou seja, descendente. Alternativamente, você pode simplesmente adicionar um sinal de menos antes do nome da variável e também obter casos classificados em ordem decrescente.

pssDesc <- arrange(
  pss,
  desc(wkhtot)
)

head(pssDesc)
##    idno    district   gndr agea          edu wkhtot     income stfdem stfeco
## 1 40446 Distrikt 10   male   63         <NA>     65 1st decile      5      6
## 2 50618 Distrikt 12 female   51         <NA>     63 2nd decile      5      6
## 3 50494 Distrikt 12 female   NA  ES-ISCED II     62 2nd decile      3      4
## 4 50491 Distrikt 12 female   NA ES-ISCED III     60 4th decile      5      4
## 5 20294  Distrikt 5   male   59 ES-ISCED III     59 6th decile      7      8
## 6 40525 Distrikt 10   male   40  ES-ISCED II     59 4th decile      3      7
##   trstprl trstprt trstplt trstlgl lrscale
## 1       2       2       9       5       7
## 2       5       4       6       4       5
## 3       3       3       4       2       1
## 4       3       6       6       6       3
## 5       6       4       7       3       5
## 6       1       3       4       1       4
# Alternativ Minuszeichen vor Variable
pssDesc2 <- arrange(
  pss, 
  -wkhtot
)

mutate()

Para calcular novas variáveis ou recodificar uma variável, usamos mutate(). No exemplo, calculamos uma variável que mostra a diferença em relação ao tempo médio de trabalho em nossa pesquisa.

mutate(
  pss, 
  wkhtotCen = wkhtot - mean(wkhtot, na.rm = TRUE)
)

Se quisermos criar novas variáveis dummy ou categóricas, precisamos usar a função case_when() adicionalmente. Na função case_when(), especificamos hierarquicamente quais condições devem ser verificadas e como devem ser recodificadas. Por exemplo, poderíamos recodificar a variável district e transformar a variável character em uma variável integer. É importante que as verificações sejam feitas em ordem hierárquica, como em uma condição if, do mais específico para o mais geral (caso contrário, teremos variáveis sem sentido!).

mutate(
  pss,
  districtRec = case_when(
    district == "Distrikt 1" ~ 1, 
    district == "Distrikt 5" ~ 5, 
    district == "Distrikt 7" ~ 7,
    district == "Distrikt 10" ~ 10, 
    district == "Distrikt 12" ~ 12,
  )
)

Aqui também é possível combinar várias condições: Agora queremos calcular um dummy que indica se as pessoas vivem no Distrito 12 e são do sexo feminino (female).

mutate(
  pss, 
  d12gndr = case_when(
    district == "Distrikt 12" & gndr == "female" ~ 1
  )
)

Neste exemplo, agora especificamos apenas uma condição para atribuir o valor 1 à nova variável. Como podemos ver, todos os outros casos são automaticamente atribuídos como NA. No entanto, queremos atribuir o valor 0 a todos os outros casos. Para não ter que escrever as diferentes combinações, usamos outro argumento da função case_when():

mutate(
  pss, 
  d12gndr = case_when(
    district == "Distrikt 12" & gndr == "female" ~ 1,
    TRUE ~ 0
  )
)

Com o argumento TRUE ~ 0, definimos que todos os outros valores recebem o valor 0. Assim, não é necessário escrever todos as outras combinações como código.

summarize()

A função summarize() nos permite resumir um valor de colunas. Por exemplo, a média de uma coluna.

summarize(
  pss, 
  mean(wkhtot)
)
##   mean(wkhtot)
## 1      34.3008

Qualquer função que exija uma coluna como entrada pode ser usada: Portanto, entre outras, first(), last(), nth(), n(), n_distinct(), IQR(), min(), max(), mean(), median(), var() e sd().

group_by()

Muitas vezes, temos variáveis categóricas nos conjuntos de dados pelas quais queremos agrupar o conjunto de dados. Por exemplo, poderíamos agrupar o conjunto de dados por área de estudo. Fazemos isso com a função group_by():

group_by(
  pss,
  gndr
)

Parece que nada mudou no conjunto de dados, mas aqui está a diferença importante em relação ao arrange(): group_by() não classifica o conjunto de dados, mas o agrupa. Portanto, a saída não muda. Se quisermos, por exemplo, exibir a média dos semestres por área de estudo, concatenamos group_by() e summarize() (mais adiante faremos isso de forma mais elegante com o Operador de Tubulação):

summarize(
  group_by(
    pss, 
    gndr
  ), 
  mean(wkhtot)
)
## # A tibble: 2 × 2
##   gndr   `mean(wkhtot)`
##   <fct>           <dbl>
## 1 female           34.5
## 2 male             34.1

Aqui está o texto traduzido para o português brasileiro:

Aqui vemos agora o que group_by() faz: Em vez de uma média, agora obtemos quatro médias (uma para cada curso no conjunto de dados). Importante: A desagregação deve sempre ser resolvida posteriormente com a função ungroup().