Piping

Depois de apresentar as funções mais comuns, vamos mostrar como a modularização ou o piping funciona com o dplyr. Como mencionado anteriormente, uma grande vantagem do dplyr é que as operações são encadeadas, ou seja, divididas em blocos individuais que são fáceis de seguir.

Através do Piping, conjuntos de dados ou tibbles são passados adiante a partir de operações anteriores. Isso é feito usando o operador %>%. Vamos ver um primeiro exemplo:

pss <- pss %>%
  group_by(district) %>%
  mutate(
    wkhtotMean = mean(
      wkhtot, 
      na.rm = TRUE
    )
  ) %>%
  ungroup() 

Primeiro passamos o conjunto de dados carregado pss. Em seguida, realizamos três operações no conjunto de dados: group_by(), mutate() e ungroup(). Depois, passamos o objeto editado de volta para o objeto original usando as setas de atribuição -> (ou seja, estamos sobrescrevendo-o!).

O exemplo calcula a média do tempo de trabalho por distrito e armazena isso na nova variável wkhtotMean. Para que isso também seja armazenado no conjunto de dados pss, salvamos essas etapas de volta no objeto pss usando a seta de atribuição.

Quando passamos o conjunto de dados, não precisamos mais chamá-lo em cada operação. Os operadores de encadeamento não precisam ser digitados manualmente, pois são inseridos automaticamente com [Ctrl] + [Shift] + [M] (Windows) ou [Cmd] + [Shift] = [M] (Mac).

A seguir, vamos realizar diferentes etapas de preparação usando encadeamento.

Calcular e Recodificar Variáveis

No exemplo a seguir, vamos criar uma nova variável que diferencia o nível de confiança das pessoas nos políticos (trstplt). Queremos distinguir entre baixa, média e alta confiança.

pss <- pss %>%
  mutate(
    trstpltG = case_when(
      trstplt <= 3 ~ "low", 
      trstplt > 3 & trstplt <= 6 ~ "medium", 
      trstplt > 6 ~ "high"
    )
  )
table(pss$trstpltG)
## 
##   high    low medium 
##    844   1275   2870

Ao verificar a nova variável, percebemos que ela foi salva como tipo character.

str(pss$trstpltG)
##  chr [1:5000] "medium" "medium" "medium" "medium" "medium" "low" "medium" ...

Isso pode ser alterado normalmente, ou podemos fazer diretamente no encadeamento:

pss <- pss %>%
  mutate(
    trstpltG = case_when(
      trstplt <= 3 ~ "low", 
      trstplt > 3 & trstplt <= 6 ~ "medium", 
      trstplt > 6 ~ "high"
    )
  ) %>% 
  mutate(trstpltG = factor(trstpltG)) #Schritt um von Character auf Factor zu kommen!

table(pss$trstpltG)
## 
##   high    low medium 
##    844   1275   2870
str(pss$trstpltG)
##  Factor w/ 3 levels "high","low","medium": 3 3 3 3 3 2 3 3 2 3 ...

Agora temos um fator, mas sem ordem, o que também podemos corrigir:

pss <- pss %>%
  mutate(
    trstpltG = case_when(
      trstplt <= 3 ~ "low", 
      trstplt > 3 & trstplt <= 6 ~ "medium", 
      trstplt > 6 ~ "high"
    )
  ) %>% 
  mutate(
    trstpltG = factor(
      trstpltG,
      ordered = TRUE, 
      levels = c(
        "low", 
        "medium", 
        "high"
      )
    ) 
  )

table(pss$trstpltG)
## 
##    low medium   high 
##   1275   2870    844
str(pss$trstpltG)
##  Ord.factor w/ 3 levels "low"<"medium"<..: 2 2 2 2 2 1 2 2 1 2 ...

Uma tarefa um pouco mais complexa seria a seguinte: não queremos apenas calcular a média do tempo de trabalho por distrito, mas sim a diferença de uma pessoa em relação à média do distrito!

pss <- pss %>%
  group_by(district) %>%
  mutate(
    wkhtotMean = mean(
      wkhtot, 
      na.rm = TRUE
    ),
    wkhtotDist = wkhtot - wkhtotMean  # wir fügen einfach diese einfache Berechnung des Abstands hinzu
  ) %>%
  ungroup()

head(
  pss[, 
      c(
        "district", 
        "wkhtot",
        "wkhtotMean",
        "wkhtotDist"
      )
  ]
)
## # A tibble: 6 × 4
##   district   wkhtot wkhtotMean wkhtotDist
##   <fct>       <dbl>      <dbl>      <dbl>
## 1 Distrikt 1     34       31.8       2.19
## 2 Distrikt 1     20       31.8     -11.8 
## 3 Distrikt 1     27       31.8      -4.81
## 4 Distrikt 1     30       31.8      -1.81
## 5 Distrikt 1     29       31.8      -2.81
## 6 Distrikt 1     30       31.8      -1.81

Aqui podemos ver uma vantagem do princípio modular. Ao calcular e passar adiante novas variáveis (como wkhtotMean), podemos usá-las diretamente nas operações seguintes.

Alternativamente, poderíamos agrupar hierarquicamente os dados por distrito e educação (edu) e, em seguida, simplesmente exibir as diferentes médias com summarize():

meansDistriktEdu <- pss %>%
  group_by(
    district,
    edu
  ) %>%
  summarize(mean(wkhtot)) 

meansDistriktEdu
## # A tibble: 29 × 3
## # Groups:   district [5]
##    district   edu          `mean(wkhtot)`
##    <fct>      <fct>                 <dbl>
##  1 Distrikt 1 ES-ISCED I             33.8
##  2 Distrikt 1 ES-ISCED II            33.2
##  3 Distrikt 1 ES-ISCED III           32.4
##  4 Distrikt 1 ES-ISCED IV            31.8
##  5 Distrikt 1 ES-ISCED V             29.5
##  6 Distrikt 1 <NA>                   31.0
##  7 Distrikt 5 ES-ISCED I             34.1
##  8 Distrikt 5 ES-ISCED II            33.6
##  9 Distrikt 5 ES-ISCED III           33.2
## 10 Distrikt 5 ES-ISCED IV            32.2
## # ℹ 19 more rows

Agora vamos dar um passo para trás e ver como podemos dividir conjuntos de dados. Isso é relevante, por exemplo, ao trabalhar com conjuntos de dados secundários, pois às vezes eles foram coletados para mais pessoas do que o necessário para o propósito da pesquisa.