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.
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.