Capítulo 7 Manipulação de dados
Após seus dados estarem carregados no ambiente R, eles provavelmente necessitarão de alguma manimulação antes de serem utilizados em uma determinada análise. Esta manipulação pode envolver operações como exclusão de colunas, ordenamento de linhas com base em valores, criação de covariáveis (que serão resultado de operações com uma ou mais variáveis existentes), dentre muitas outras possibilidades. Felizmente, o pacote dplyr permite que esta manimulação seja relativamente fácil, lógica (do ponto de vista de digitação de códigos) e rápida, pois ele integra a linguagem C++
em suas funções.
O pacote dplyr é uma gramática de manipulação de dados. Nos rerferimos à gramática aqui porque ele fornece funções nomeadas como verbos simples, relacionados às tarefas mais comuns de manipulação de dados, para ajudá-lo a traduzir seus pensamentos em código. Este será o pacote utilizado para manipulação dos dados no decorrer deste material. De fato, a maioria dos dados em R podem ser manipulados utilizando os seguintes “verbos”.
-
filter()
para selecionar linhas com base em seus valores. -
arrange()
para reordenar as linhas. -
select()
erename()
para selecionar variáveis com base em seus nomes. -
mutate()
etransmute()
para adicionar novas variáveis que são funções de variáveis existentes. -
summarise()
para resumir vários valores para um único valor. -
sample_n()
esample_frac()
para obter amostras aleatórias.
Anteriomente mencionamos que a manipulação dos dados com o pacote dplyr é lógica do ponto de vista da implementação do código. Isto só é possivel devido a utilização do operador %>%
(forward-pipe operator), importado do pacote magrittr
. Basicamente, este operador capta o argumento resultante de uma função à sua esquerda e passa como input à função à sua direita. Não é nossso objetivo aqui discutir os benefícios da utilização deste operador, mas uma pequena demonstração (com spoilers das funções do pacote dplyr) será apresentada. Considere as seguintes (e simples) operações. Crie um data frame com 100 linhas com as variáveis x e y contendo valores aleatórios. Adicione uma terceira variáveis (z) que será uma função da multiplicação de x e y, selecione apenas os valores de z menores que 10 e extraia a raiz quadrada destes valores. Finalmente, compute a média e armazene no object mean_sqrt
.
- Criando o conjunto de dados
library(tidyverse)
library(metan)
set.seed(1)
data <- tibble(x = runif(100, 0, 10),
y = runif(100, 0, 10))
- Utilizando as funções bases do R (código massivo)
data$z <- data$x * data$y
df <- subset(data, z < 10)
df <- df[, 3]
sqr_dat <- sqrt(df$z)
mean_sqrt <- mean(sqr_dat)
mean_sqrt
# [1] 1.977507
- Utilizando as funções bases do R (código mais limpo)
- Utilizando o operdor
%>%
mean_sqrt <-
data %>%
mutate(z = x * y) %>%
filter(z < 10) %>%
pull(z) %>%
sqrt() %>%
mean()
mean_sqrt
# [1] 1.977507
A utilização do operador %>%
parece não trazer tantos benefícios neste exemplo, visto que objetivo aqui foi demonstrar como ele permite uma implementação lógica das operações realizadas, captando a saída da função diretamente à esquerda (acima neste caso) e passando para a próxima função. Em operações mais complexas, no entanto, o %>%
se mostrará muito mais útil.
O pacote metan
fornece funções úteis para manipulação de dados. Duas principais categorias de funções serão utilizadas neste material:
-
add_cols()
: adiciona uma ou mais colunas a um conjunto de dados existente. Se as colunas.before
ou.after
especificadas não existirem, as colunas serão anexadas no final dos dados. Retorna um conjunto de dados com todas as colunas originais em.data
mais as colunas declaradas em...
. Emadd_cols()
, as colunas em.data
estão disponíveis para as expressões. Portanto, é possível adicionar uma coluna com base nos dados existentes. -
add_rows()
: adiciona uma ou mais linhas a um conjunto de dados existente. Se não houver linhas especificadas.before
ou.after
, as linhas serão anexadas no final dos dados. Retorna um conjunto de dados com todas as linhas originais em .data mais as linhas declaradas em...
. -
add_prefix()
eadd_suffix()
: adicionam prefixos e sufixos, respectivamente, nos nomes das variáveis selecionadas. -
all_pairs()
: obtém todos os pares possíveis entre os níveis de um fator. -
colnames_to_lower()
: converte todos os nomes de coluna para minúsculas. -
colnames_to_upper()
: converte todos os nomes de coluna para maiúsculas. -
colnames_to_title()
: converte todos os nomes de coluna em maiúsculas. -
column_exists()
: verifica se existe uma coluna em um conjunto de dados. Retorne um valor lógico. -
columns_to_first()
: move as colunas para as primeiras posições em.data
. -
columns_to_last()
: move as colunas para as últimas posições em.data
. -
concatenate()
: concatena colunas de um conjunto de dados. -
get_levels()
: obtém os níveis de um fator. -
get_level_size()
: obtém o tamanho de cada nível de um fator. -
remove_cols()
: remove uma ou mais colunas de um conjunto de dados. -
remove_rows()
: remove uma ou mais linhas de um conjunto de dados. -
reorder_cols()
: reordena colunas em um conjunto de dados. -
select_cols()
: seleciona uma ou mais colunas de um conjunto de dados. -
select_first_col()
: seleciona a primeira variável, possivelmente com um deslocamento. -
select_last_col()
: seleciona a última variável, possivelmente com um deslocamento. -
select_numeric_cols()
: selecione todas as colunas numéricas de um conjunto de dados. -
select_non_numeric_cols()
: seleciona todas as colunas não numéricas de um conjunto de dados. -
select_rows()
: seleciona uma ou mais linhas de um conjunto de dados.
-
all_lower_case()
: converte todas as sequências não numéricas de um conjunto de dados para minúsculas (“Env” para “env”). -
all_upper_case()
: converte todas as sequências não numéricas de um conjunto de dados para maiúsculas (por exemplo, “Env” para “ENV”). -
all_title_case()
: converta todas as sequências não numéricas de um conjunto de dados em maiúsculas e minúsculas (por exemplo, “ENV” para “Env”). -
extract_number()
: extrai o(s) número(s) de uma sequência de caracteres. -
extract_string()
: Extrai todas letras de uma sequência de caracteres, ignorando maiúsculas e minúsculas. -
find_text_in_num()
: encontra caracteres de texto em uma sequência numérica e retorna o índice de linha. -
has_text_in_num()
: inspeciona as colunas procurando por texto na sequência numérica e retorna um aviso se algum texto for encontrado. -
remove_strings()
: remove todas as strings de uma variável. -
replace_number()
: substitui os números por uma substituição. -
replace_string()
: substitui todas as strings por uma substituição, ignorando a caixa. -
round_cols()
: Arredonda uma coluna selecionada ou um conjunto de dados inteiro para números significativos. -
tidy_strings()
: arruma seqüências de caracteres, colunas não numéricas ou quaisquer colunas selecionadas em um conjunto de dados colocando todas as palavras em maiúsculas, substituindo qualquer espaço, tabulação e caracteres de pontuação por'_'
e colocando'_'
entre letras maiúsculas e minúsculas. Suponha questr = c("Env1", "env 1", "env.1")
(que por definição deve representar um nível único nos ensaios de melhoramento de plantas, por exemplo, ambiente 1) seja submetido atidy_strings(str)
: o resultado será entãoc("ENV_1", "ENV_1", "ENV_1")
.
O conjunto de dados maize será utilizado como exemplo para as operações de manipulação de dados. Este arquivo em formato .xlsx
está hospedado em https://github.com/TiagoOlivoto/e-bookr/tree/master/data e pode ser carregado no ambiente R com a função import()
do pacote rio.
library(rio)
url <- "https://github.com/TiagoOlivoto/e-bookr/raw/master/data/data_R.xlsx"
maize <- import(url,
sheet = "maize",
setclass = "tibble")
inspect(maize)
# # A tibble: 10 x 9
# Variable Class Missing Levels Valid_n Min Median Max Outlier
# <chr> <chr> <chr> <chr> <int> <dbl> <dbl> <dbl> <dbl>
# 1 AMB character No 0 780 NA NA NA NA
# 2 HIB character No 0 780 NA NA NA NA
# 3 REP character No 0 780 NA NA NA NA
# 4 APLA numeric No - 780 1 2.52 3.3 4
# 5 AIES numeric No - 780 0.5 1.38 2.39 1
# 6 CESP numeric No - 780 0.8 15.4 20.4 16
# 7 DIES numeric No - 780 36.4 50.0 59.7 1
# 8 MGRA numeric No - 780 58.5 174. 291. 0
# 9 MMG numeric No - 780 123. 344. 546. 6
# 10 NGRA numeric No - 780 147 517 903 9
7.1 Trabalhando com linhas e colunas
7.1.1 Selecionar colunas
A função select_cols()
pode ser usada para selecionar colunas de um conjunto de dados.
select_cols(maize, AMB, HIB)
# # A tibble: 780 x 2
# AMB HIB
# <chr> <chr>
# 1 A1 H1
# 2 A1 H1
# 3 A1 H1
# 4 A1 H1
# 5 A1 H1
# 6 A1 H1
# 7 A1 H1
# 8 A1 H1
# 9 A1 H1
# 10 A1 H1
# # ... with 770 more rows
As colunas numéricas podem ser selecionadas rapidamente usando a função select_numeric_cols()
. As colunas não numéricas são selecionadas com select_non_numeric_cols()
.
select_numeric_cols(maize)
# # A tibble: 780 x 7
# APLA AIES CESP DIES MGRA MMG NGRA
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 2.45 2.39 16.9 52.1 228. 375. 609
# 2 2.5 1.43 14.4 50.7 187. 437. 427
# 3 2.69 1.52 16.5 54.7 230. 464. 497
# 4 2.8 1.64 16.8 52.0 213. 408. 523
# 5 2.62 1.55 15.9 51.6 224. 406. 551
# 6 2.12 1.8 15 51.4 203. 383. 529
# 7 3.15 1.78 10.9 41.9 75.2 256. 294
# 8 2.97 1.84 15 53.4 204. 387. 528
# 9 3.1 1.78 13.6 50.8 187. 348. 538
# 10 3.02 1.6 16.3 53.9 250. 430. 582
# # ... with 770 more rows
select_non_numeric_cols(maize)
# # A tibble: 780 x 3
# AMB HIB REP
# <chr> <chr> <chr>
# 1 A1 H1 I
# 2 A1 H1 I
# 3 A1 H1 I
# 4 A1 H1 I
# 5 A1 H1 I
# 6 A1 H1 II
# 7 A1 H1 II
# 8 A1 H1 II
# 9 A1 H1 II
# 10 A1 H1 II
# # ... with 770 more rows
Podemos selecionar a primeira ou a última coluna rapidamente com select_first_col()
e select_last_col()
, respectivamente.
select_first_col(maize)
# # A tibble: 780 x 1
# AMB
# <chr>
# 1 A1
# 2 A1
# 3 A1
# 4 A1
# 5 A1
# 6 A1
# 7 A1
# 8 A1
# 9 A1
# 10 A1
# # ... with 770 more rows
select_last_col(maize)
# # A tibble: 780 x 1
# NGRA
# <dbl>
# 1 609
# 2 427
# 3 497
# 4 523
# 5 551
# 6 529
# 7 294
# 8 528
# 9 538
# 10 582
# # ... with 770 more rows
Select helpers podem ser usados para selecionar variáveis que correspondem a uma expressão. Isso significa que podemos usar uma função para selecionar variáveis em vez de digitar seus próprios nomes. O metan
reexporta os tidy select helpers e implementa os próprios select helpers com base em operações com prefixos e sufixos (different_var()
, intersect_var()
e union_var()
), tamanho dos nomes das variáveis (width_of()
, width_gength_than()
e width_less_than()
) e no tipo de letra (lower_case_only()
, upper_case_only()
e title_case_only()
).
- Selecionando variáveis que começam com um prefixo.
Se quisermos selecionar as variáveis que começam com “C”, podemos usar:
select_cols(maize, starts_with("C"))
# # A tibble: 780 x 1
# CESP
# <dbl>
# 1 16.9
# 2 14.4
# 3 16.5
# 4 16.8
# 5 15.9
# 6 15
# 7 10.9
# 8 15
# 9 13.6
# 10 16.3
# # ... with 770 more rows
mas se quisermos selecionar aqueles que não começam com “C”, basta adicionar “-” logo antes de starts_with()
select_cols(maize, -starts_with("C"))
# # A tibble: 780 x 9
# AMB HIB REP APLA AIES DIES MGRA MMG NGRA
# <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A1 H1 I 2.45 2.39 52.1 228. 375. 609
# 2 A1 H1 I 2.5 1.43 50.7 187. 437. 427
# 3 A1 H1 I 2.69 1.52 54.7 230. 464. 497
# 4 A1 H1 I 2.8 1.64 52.0 213. 408. 523
# 5 A1 H1 I 2.62 1.55 51.6 224. 406. 551
# 6 A1 H1 II 2.12 1.8 51.4 203. 383. 529
# 7 A1 H1 II 3.15 1.78 41.9 75.2 256. 294
# 8 A1 H1 II 2.97 1.84 53.4 204. 387. 528
# 9 A1 H1 II 3.1 1.78 50.8 187. 348. 538
# 10 A1 H1 II 3.02 1.6 53.9 250. 430. 582
# # ... with 770 more rows
- Selecionando variáveis que terminam com um sufixo.
Da mesma forma, se quisermos selecionar as variáveis que terminam com “S”, podemos usar:
select_cols(maize, ends_with("S"))
# # A tibble: 780 x 2
# AIES DIES
# <dbl> <dbl>
# 1 2.39 52.1
# 2 1.43 50.7
# 3 1.52 54.7
# 4 1.64 52.0
# 5 1.55 51.6
# 6 1.8 51.4
# 7 1.78 41.9
# 8 1.84 53.4
# 9 1.78 50.8
# 10 1.6 53.9
# # ... with 770 more rows
- Selecionando variáveis que começam com um prefixo A E terminam com um sufixo “S”
Agora, se quisermos selecionar variáveis que começam com “A” e terminam com “S”, ou seja, a interseção entre a letra inicial “A” e a letra final “S”, podemos:
select_cols(maize, intersect_var("A", "S"))
# # A tibble: 780 x 1
# AIES
# <dbl>
# 1 2.39
# 2 1.43
# 3 1.52
# 4 1.64
# 5 1.55
# 6 1.8
# 7 1.78
# 8 1.84
# 9 1.78
# 10 1.6
# # ... with 770 more rows
- Selecionando variáveis que começam com um prefixo OU terminam com um sufixo.
Também podemos obter a união entre a letra inicial “A” e a letra final “S”, ou seja, variáveis que começam com “A” ou terminam com “S”.
select_cols(maize, union_var("A", "S"))
# # A tibble: 780 x 4
# AMB APLA AIES DIES
# <chr> <dbl> <dbl> <dbl>
# 1 A1 2.45 2.39 52.1
# 2 A1 2.5 1.43 50.7
# 3 A1 2.69 1.52 54.7
# 4 A1 2.8 1.64 52.0
# 5 A1 2.62 1.55 51.6
# 6 A1 2.12 1.8 51.4
# 7 A1 3.15 1.78 41.9
# 8 A1 2.97 1.84 53.4
# 9 A1 3.1 1.78 50.8
# 10 A1 3.02 1.6 53.9
# # ... with 770 more rows
- Selecionando variáveis que começam com um prefixo E NÃO terminam com um sufixo.
Também podemos obter a diferença entre a letra inicial “A” e a letra final “S”, ou seja, variáveis que começam com “C” e não terminam com “D”.
select_cols(maize, difference_var("A", "S"))
# # A tibble: 780 x 2
# AMB APLA
# <chr> <dbl>
# 1 A1 2.45
# 2 A1 2.5
# 3 A1 2.69
# 4 A1 2.8
# 5 A1 2.62
# 6 A1 2.12
# 7 A1 3.15
# 8 A1 2.97
# 9 A1 3.1
# 10 A1 3.02
# # ... with 770 more rows
- Selecionando variáveis que contêm uma string literal.
Se as variáveis no conjunto de dados tiverem um padrão com diferenças entre um grupo de variáveis, podemos usar o código a seguir para selecionar variáveis com um padrão. Primeiro, iremos alterar os nomes das variáveis PH
, EH
, EP
e EL
incluindo _PLANT
para indicar que são variáveis relacionadas à planta. Em seguida, selecionaremos essas variáveis com a função contains()
.
data_vars <-
maize %>%
rename(APLA_PLANT = APLA,
AIES_PLANT = AIES)
names(data_vars)
# [1] "AMB" "HIB" "REP" "APLA_PLANT" "AIES_PLANT"
# [6] "CESP" "DIES" "MGRA" "MMG" "NGRA"
select_cols(data_vars, contains("PLANT"))
# # A tibble: 780 x 2
# APLA_PLANT AIES_PLANT
# <dbl> <dbl>
# 1 2.45 2.39
# 2 2.5 1.43
# 3 2.69 1.52
# 4 2.8 1.64
# 5 2.62 1.55
# 6 2.12 1.8
# 7 3.15 1.78
# 8 2.97 1.84
# 9 3.1 1.78
# 10 3.02 1.6
# # ... with 770 more rows
- Selecionando variáveis que correspondem a uma expressão regular.
Seleções mais sofisticadas podem ser feitas usando matches()
. Supondo que gostaríamos de selecionar as variáveis que começam com “A” e tem a segunda letra entre “A” e “M”, usaríamos algo como:
select_cols(maize, matches("^A[A-M]"))
# # A tibble: 780 x 2
# AMB AIES
# <chr> <dbl>
# 1 A1 2.39
# 2 A1 1.43
# 3 A1 1.52
# 4 A1 1.64
# 5 A1 1.55
# 6 A1 1.8
# 7 A1 1.78
# 8 A1 1.84
# 9 A1 1.78
# 10 A1 1.6
# # ... with 770 more rows
- Selecionando a última ou a primeira variável, possivelmente com um deslocamento.
Podemos selecionar a n-ésima primeira ou a última coluna com select_last_col()
ou select_first_col()
.
select_first_col(data_vars)
# # A tibble: 780 x 1
# AMB
# <chr>
# 1 A1
# 2 A1
# 3 A1
# 4 A1
# 5 A1
# 6 A1
# 7 A1
# 8 A1
# 9 A1
# 10 A1
# # ... with 770 more rows
select_last_col(data_vars)
# # A tibble: 780 x 1
# NGRA
# <dbl>
# 1 609
# 2 427
# 3 497
# 4 523
# 5 551
# 6 529
# 7 294
# 8 528
# 9 538
# 10 582
# # ... with 770 more rows
- Selecione variáveis com um comprimento de nome específico (quatro letras)
select_cols(data_vars, width_of(4))
# # A tibble: 780 x 4
# CESP DIES MGRA NGRA
# <dbl> <dbl> <dbl> <dbl>
# 1 16.9 52.1 228. 609
# 2 14.4 50.7 187. 427
# 3 16.5 54.7 230. 497
# 4 16.8 52.0 213. 523
# 5 15.9 51.6 224. 551
# 6 15 51.4 203. 529
# 7 10.9 41.9 75.2 294
# 8 15 53.4 204. 528
# 9 13.6 50.8 187. 538
# 10 16.3 53.9 250. 582
# # ... with 770 more rows
- Selecione variáveis com largura menor que n.
select_cols(data_vars, width_less_than(4))
# # A tibble: 780 x 4
# AMB HIB REP MMG
# <chr> <chr> <chr> <dbl>
# 1 A1 H1 I 375.
# 2 A1 H1 I 437.
# 3 A1 H1 I 464.
# 4 A1 H1 I 408.
# 5 A1 H1 I 406.
# 6 A1 H1 II 383.
# 7 A1 H1 II 256.
# 8 A1 H1 II 387.
# 9 A1 H1 II 348.
# 10 A1 H1 II 430.
# # ... with 770 more rows
- Selecione variáveis com largura maior que * n *.
select_cols(data_vars, width_greater_than(3))
# # A tibble: 780 x 6
# APLA_PLANT AIES_PLANT CESP DIES MGRA NGRA
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 2.45 2.39 16.9 52.1 228. 609
# 2 2.5 1.43 14.4 50.7 187. 427
# 3 2.69 1.52 16.5 54.7 230. 497
# 4 2.8 1.64 16.8 52.0 213. 523
# 5 2.62 1.55 15.9 51.6 224. 551
# 6 2.12 1.8 15 51.4 203. 529
# 7 3.15 1.78 10.9 41.9 75.2 294
# 8 2.97 1.84 15 53.4 204. 528
# 9 3.1 1.78 13.6 50.8 187. 538
# 10 3.02 1.6 16.3 53.9 250. 582
# # ... with 770 more rows
- Selecione variáveis por tipo de letra
Vamos criar um conjunto de dados com nomes de colunas bagunçados.
df <- head(maize, 3)
colnames(df) <- c ("Amg", "hib", "Rep", "APLA", "AIES", "CESp", "dies", "Mgra", "mmG", "ngra")
select_cols(df, lower_case_only())
# # A tibble: 3 x 3
# hib dies ngra
# <chr> <dbl> <dbl>
# 1 H1 52.1 609
# 2 H1 50.7 427
# 3 H1 54.7 497
select_cols(df, upper_case_only())
# # A tibble: 3 x 2
# APLA AIES
# <dbl> <dbl>
# 1 2.45 2.39
# 2 2.5 1.43
# 3 2.69 1.52
select_cols(df, title_case_only())
# # A tibble: 3 x 3
# Amg Rep Mgra
# <chr> <chr> <dbl>
# 1 A1 I 228.
# 2 A1 I 187.
# 3 A1 I 230.
7.1.2 Remover linhas ou colunas
Podemos usar remove_cols()
e remove_rows()
para remover colunas e linhas, respectivamente.
remove_cols(maize, AMB, HIB)
# # A tibble: 780 x 8
# REP APLA AIES CESP DIES MGRA MMG NGRA
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 I 2.45 2.39 16.9 52.1 228. 375. 609
# 2 I 2.5 1.43 14.4 50.7 187. 437. 427
# 3 I 2.69 1.52 16.5 54.7 230. 464. 497
# 4 I 2.8 1.64 16.8 52.0 213. 408. 523
# 5 I 2.62 1.55 15.9 51.6 224. 406. 551
# 6 II 2.12 1.8 15 51.4 203. 383. 529
# 7 II 3.15 1.78 10.9 41.9 75.2 256. 294
# 8 II 2.97 1.84 15 53.4 204. 387. 528
# 9 II 3.1 1.78 13.6 50.8 187. 348. 538
# 10 II 3.02 1.6 16.3 53.9 250. 430. 582
# # ... with 770 more rows
As funções remove_rows_na()
e remove_rows_na()
são usados para remover linhas e colunas com valores NA
, respectivamente.
data_with_na <- maize
data_with_na[c (1, 5, 10), c (3:5, 9:10)] <- NA
remove_cols_na(data_with_na)
# Warning: Column(s) REP, APLA, AIES, MMG, NGRA with NA values deleted.
# # A tibble: 780 x 5
# AMB HIB CESP DIES MGRA
# <chr> <chr> <dbl> <dbl> <dbl>
# 1 A1 H1 16.9 52.1 228.
# 2 A1 H1 14.4 50.7 187.
# 3 A1 H1 16.5 54.7 230.
# 4 A1 H1 16.8 52.0 213.
# 5 A1 H1 15.9 51.6 224.
# 6 A1 H1 15 51.4 203.
# 7 A1 H1 10.9 41.9 75.2
# 8 A1 H1 15 53.4 204.
# 9 A1 H1 13.6 50.8 187.
# 10 A1 H1 16.3 53.9 250.
# # ... with 770 more rows
remove_rows_na(data_with_na)
# Warning: Row(s) 1, 5, 10 with NA values deleted.
# # A tibble: 777 x 10
# AMB HIB REP APLA AIES CESP DIES MGRA MMG NGRA
# <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A1 H1 I 2.5 1.43 14.4 50.7 187. 437. 427
# 2 A1 H1 I 2.69 1.52 16.5 54.7 230. 464. 497
# 3 A1 H1 I 2.8 1.64 16.8 52.0 213. 408. 523
# 4 A1 H1 II 2.12 1.8 15 51.4 203. 383. 529
# 5 A1 H1 II 3.15 1.78 10.9 41.9 75.2 256. 294
# 6 A1 H1 II 2.97 1.84 15 53.4 204. 387. 528
# 7 A1 H1 II 3.1 1.78 13.6 50.8 187. 348. 538
# 8 A1 H1 III 2.69 1.52 15.6 49.5 195. 369. 529
# 9 A1 H1 III 2.6 1.68 14.3 48.9 172. 344. 500
# 10 A1 H1 III 2.82 1.52 18.4 54.3 255. 371. 689
# # ... with 767 more rows
7.1.3 Ordenar linhas
A função arrange()
é utilizada para ordenar as linhas de um tibble (ou data.frames) com base em uma expressão envolvendo suas variáveis. Considerando as funções que vimos até aqui, vamos computar a média para a MGRA, criar uma nova variável chamada Rank, qual corresponde ao ranqueamento dos híbridos para a variável em questão e ordenar a variável Rank em ordem crescente, onde o híbrido com a maior média ficará na primeira linha.
maize %>%
group_by(HIB) %>%
summarise(MGRA_mean = mean(MGRA)) %>%
mutate(Rank = rank(MGRA_mean)) %>%
arrange(-Rank)
# # A tibble: 13 x 3
# HIB MGRA_mean Rank
# <chr> <dbl> <dbl>
# 1 H6 188. 13
# 2 H2 187. 12
# 3 H4 184. 11
# 4 H1 184. 10
# 5 H5 184. 9
# 6 H13 180. 8
# 7 H7 171. 7
# 8 H3 169. 6
# 9 H11 167. 5
# 10 H10 164. 4
# 11 H8 160. 3
# 12 H12 157. 2
# 13 H9 153. 1
Exercício 3
- Considerando o exemplo anterior, ordene a variável Rank em ordem decrescente.
Ao combinar a função group_by()
com arrange()
é possível realizar o ordenamento para cada nível de um determinado fator. No exemplo abaixo, a variável APLA
é ordenada de maneira crescente para cada híbrido.
maize %>%
group_by(HIB) %>%
arrange(APLA, .by_group = TRUE)
# # A tibble: 780 x 10
# # Groups: HIB [13]
# AMB HIB REP APLA AIES CESP DIES MGRA MMG NGRA
# <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A3 H1 II 1.93 0.93 13 50.0 120. 276. 433
# 2 A3 H1 I 2 1.05 19.9 53.3 253. 444. 570
# 3 A3 H1 I 2.07 1.05 13.2 47.9 110. 293. 377
# 4 A3 H1 II 2.08 0.94 12 47.6 103. 334. 309
# 5 A3 H1 III 2.1 0.97 17.5 50.8 222. 423. 524
# 6 A1 H1 II 2.12 1.8 15 51.4 203. 383. 529
# 7 A3 H1 I 2.12 1.03 18.5 52.0 214. 382. 560
# 8 A3 H1 III 2.12 0.96 15 56.8 174. 339. 512
# 9 A3 H1 I 2.13 1.05 11.6 47.0 89.5 300. 298
# 10 A4 H1 I 2.13 1.1 12.8 47.6 144. 280. 516
# # ... with 770 more rows
7.1.4 Selecionar top n linhas baseado em valor
A função top_n()
é usada para selecionar linhas superiores ou inferiores em cada grupo.
# seleciona as duas linhas com o maior valor de MGRA
top_n(maize, 2, MGRA)
# # A tibble: 2 x 10
# AMB HIB REP APLA AIES CESP DIES MGRA MMG NGRA
# <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A1 H6 I 2.92 1.64 18 56.0 289. 393. 734
# 2 A1 H13 II 2.47 1.28 15.3 53.0 291. 417. 698
# seleciona as duas linhas com o menor valor de MGRA
top_n(maize, 2, -MGRA)
# # A tibble: 2 x 10
# AMB HIB REP APLA AIES CESP DIES MGRA MMG NGRA
# <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A1 H9 III 2.72 1.54 11 42.8 58.5 295. 198
# 2 A2 H8 I 1.92 0.63 12.1 39.7 59.5 243. 245
# Maior produtividade em cada ambiente
maize %>%
group_by(AMB) %>%
top_n(1, MGRA)
# # A tibble: 4 x 10
# # Groups: AMB [4]
# AMB HIB REP APLA AIES CESP DIES MGRA MMG NGRA
# <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A1 H13 II 2.47 1.28 15.3 53.0 291. 417. 698
# 2 A2 H6 III 3.18 1.62 19.2 53.0 270. 382. 708
# 3 A3 H1 I 2 1.05 19.9 53.3 253. 444. 570
# 4 A4 H10 I 2.65 1.47 14 50.3 287. 275. 493
7.1.5 Adicionar novas variáveis
A função mutate()
é utilizada quando se deseja adicionar novas variáveis no conjunto de dados. Estas variáveis são funções de variáveis existentes. Como exemplo, vamos criar uma nova variável chamada PRE_2
no conjunto de dados maize
, qual será a razão entre AIES e APLA. Note que a função adiciona a nova variável após a última variável origina e mantém todas as demais. Digamos que queríamos adicionar a nova variável criada após a variável REP, a seguinte abordagem com o pacote dplyr
deve ser usada.
maize %>%
mutate(PRE_2 = AIES/APLA) %>%
select(AMB, HIB, REP, PRE_2, everything())
# # A tibble: 780 x 11
# AMB HIB REP PRE_2 APLA AIES CESP DIES MGRA MMG NGRA
# <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A1 H1 I 0.976 2.45 2.39 16.9 52.1 228. 375. 609
# 2 A1 H1 I 0.572 2.5 1.43 14.4 50.7 187. 437. 427
# 3 A1 H1 I 0.565 2.69 1.52 16.5 54.7 230. 464. 497
# 4 A1 H1 I 0.586 2.8 1.64 16.8 52.0 213. 408. 523
# 5 A1 H1 I 0.592 2.62 1.55 15.9 51.6 224. 406. 551
# 6 A1 H1 II 0.849 2.12 1.8 15 51.4 203. 383. 529
# 7 A1 H1 II 0.565 3.15 1.78 10.9 41.9 75.2 256. 294
# 8 A1 H1 II 0.620 2.97 1.84 15 53.4 204. 387. 528
# 9 A1 H1 II 0.574 3.1 1.78 13.6 50.8 187. 348. 538
# 10 A1 H1 II 0.530 3.02 1.6 16.3 53.9 250. 430. 582
# # ... with 770 more rows
Com a função add_cols()
, o mesmo resultado pode ser obtido com:
add_cols(maize,
PRE_2 = AIES/APLA,
.after = REP)
# # A tibble: 780 x 11
# AMB HIB REP PRE_2 APLA AIES CESP DIES MGRA MMG NGRA
# <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A1 H1 I 0.976 2.45 2.39 16.9 52.1 228. 375. 609
# 2 A1 H1 I 0.572 2.5 1.43 14.4 50.7 187. 437. 427
# 3 A1 H1 I 0.565 2.69 1.52 16.5 54.7 230. 464. 497
# 4 A1 H1 I 0.586 2.8 1.64 16.8 52.0 213. 408. 523
# 5 A1 H1 I 0.592 2.62 1.55 15.9 51.6 224. 406. 551
# 6 A1 H1 II 0.849 2.12 1.8 15 51.4 203. 383. 529
# 7 A1 H1 II 0.565 3.15 1.78 10.9 41.9 75.2 256. 294
# 8 A1 H1 II 0.620 2.97 1.84 15 53.4 204. 387. 528
# 9 A1 H1 II 0.574 3.1 1.78 13.6 50.8 187. 348. 538
# 10 A1 H1 II 0.530 3.02 1.6 16.3 53.9 250. 430. 582
# # ... with 770 more rows
Exercício 2
Crie uma variável chamada MGRA_kg qual será o resultado em quilogramas da massa de grãos.
Selecione somente as colunas HIB, AMB, REP e MGRA_Kg.
Selecione somente as cinco linhas com maior valor de MGRA_Kg.
7.1.6 Concatenar colunas
A função concatenate()
pode ser usada para concatenar várias colunas de um conjunto de dados. concatenate()
retorna um quadro de dados com todas as colunas originais em .data
mais a variável concatenada, após a última coluna, nomeada como new_var
. Para escolher a posição da nova variável, use o argumento .after
ou.before
, como a seguir.
concatenate(maize, AMB:REP, .after = REP)
# # A tibble: 780 x 11
# AMB HIB REP new_var APLA AIES CESP DIES MGRA MMG NGRA
# <chr> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A1 H1 I A1_H1_I 2.45 2.39 16.9 52.1 228. 375. 609
# 2 A1 H1 I A1_H1_I 2.5 1.43 14.4 50.7 187. 437. 427
# 3 A1 H1 I A1_H1_I 2.69 1.52 16.5 54.7 230. 464. 497
# 4 A1 H1 I A1_H1_I 2.8 1.64 16.8 52.0 213. 408. 523
# 5 A1 H1 I A1_H1_I 2.62 1.55 15.9 51.6 224. 406. 551
# 6 A1 H1 II A1_H1_II 2.12 1.8 15 51.4 203. 383. 529
# 7 A1 H1 II A1_H1_II 3.15 1.78 10.9 41.9 75.2 256. 294
# 8 A1 H1 II A1_H1_II 2.97 1.84 15 53.4 204. 387. 528
# 9 A1 H1 II A1_H1_II 3.1 1.78 13.6 50.8 187. 348. 538
# 10 A1 H1 II A1_H1_II 3.02 1.6 16.3 53.9 250. 430. 582
# # ... with 770 more rows
concatenate()
também pode ser utilizada dentro de add_cols()
para mutar um conjunto de dados. Para isso, é preciso utilizar o argumento pull = TRUE
para que o valor concatenado seja exibido como um vetor. Note que agora o argumento .after
é utilizado dentro da função add_cols()
.
maize %>%
add_cols(AMB_REP = concatenate(., AMB:REP, pull = TRUE),
.after = REP) %>%
head()
# # A tibble: 6 x 11
# AMB HIB REP AMB_REP APLA AIES CESP DIES MGRA MMG NGRA
# <chr> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A1 H1 I A1_H1_I 2.45 2.39 16.9 52.1 228. 375. 609
# 2 A1 H1 I A1_H1_I 2.5 1.43 14.4 50.7 187. 437. 427
# 3 A1 H1 I A1_H1_I 2.69 1.52 16.5 54.7 230. 464. 497
# 4 A1 H1 I A1_H1_I 2.8 1.64 16.8 52.0 213. 408. 523
# 5 A1 H1 I A1_H1_I 2.62 1.55 15.9 51.6 224. 406. 551
# 6 A1 H1 II A1_H1_II 2.12 1.8 15 51.4 203. 383. 529
7.1.7 Formatar nomes de coluna
As funções colnames_to_lower()
, colnames_to_upper()
e colnames_to_title()
podem ser usados para converter nomes de colunas em maiúsculas, minúsculas ou em formato de título, respectivamente .
colnames_to_lower(maize) %>% head()
# # A tibble: 6 x 10
# amb hib rep apla aies cesp dies mgra mmg ngra
# <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A1 H1 I 2.45 2.39 16.9 52.1 228. 375. 609
# 2 A1 H1 I 2.5 1.43 14.4 50.7 187. 437. 427
# 3 A1 H1 I 2.69 1.52 16.5 54.7 230. 464. 497
# 4 A1 H1 I 2.8 1.64 16.8 52.0 213. 408. 523
# 5 A1 H1 I 2.62 1.55 15.9 51.6 224. 406. 551
# 6 A1 H1 II 2.12 1.8 15 51.4 203. 383. 529
colnames_to_upper(maize) %>% head()
# # A tibble: 6 x 10
# AMB HIB REP APLA AIES CESP DIES MGRA MMG NGRA
# <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A1 H1 I 2.45 2.39 16.9 52.1 228. 375. 609
# 2 A1 H1 I 2.5 1.43 14.4 50.7 187. 437. 427
# 3 A1 H1 I 2.69 1.52 16.5 54.7 230. 464. 497
# 4 A1 H1 I 2.8 1.64 16.8 52.0 213. 408. 523
# 5 A1 H1 I 2.62 1.55 15.9 51.6 224. 406. 551
# 6 A1 H1 II 2.12 1.8 15 51.4 203. 383. 529
colnames_to_title(maize) %>% head()
# # A tibble: 6 x 10
# Amb Hib Rep Apla Aies Cesp Dies Mgra Mmg Ngra
# <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A1 H1 I 2.45 2.39 16.9 52.1 228. 375. 609
# 2 A1 H1 I 2.5 1.43 14.4 50.7 187. 437. 427
# 3 A1 H1 I 2.69 1.52 16.5 54.7 230. 464. 497
# 4 A1 H1 I 2.8 1.64 16.8 52.0 213. 408. 523
# 5 A1 H1 I 2.62 1.55 15.9 51.6 224. 406. 551
# 6 A1 H1 II 2.12 1.8 15 51.4 203. 383. 529
7.1.8 Reordenando colunas
A função reorder_cols()
pode ser usada para reordenar as colunas de um quadro de dados.
reorder_cols(data_vars, contains("PLANT"), .before = AMB) %>% head()
# # A tibble: 6 x 10
# APLA_PLANT AIES_PLANT AMB HIB REP CESP DIES MGRA MMG NGRA
# <dbl> <dbl> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 2.45 2.39 A1 H1 I 16.9 52.1 228. 375. 609
# 2 2.5 1.43 A1 H1 I 14.4 50.7 187. 437. 427
# 3 2.69 1.52 A1 H1 I 16.5 54.7 230. 464. 497
# 4 2.8 1.64 A1 H1 I 16.8 52.0 213. 408. 523
# 5 2.62 1.55 A1 H1 I 15.9 51.6 224. 406. 551
# 6 2.12 1.8 A1 H1 II 15 51.4 203. 383. 529
reorder_cols(data_vars, AMB, HIB, .after = REP) %>% head()
# # A tibble: 6 x 10
# REP AMB HIB APLA_PLANT AIES_PLANT CESP DIES MGRA MMG NGRA
# <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 I A1 H1 2.45 2.39 16.9 52.1 228. 375. 609
# 2 I A1 H1 2.5 1.43 14.4 50.7 187. 437. 427
# 3 I A1 H1 2.69 1.52 16.5 54.7 230. 464. 497
# 4 I A1 H1 2.8 1.64 16.8 52.0 213. 408. 523
# 5 I A1 H1 2.62 1.55 15.9 51.6 224. 406. 551
# 6 II A1 H1 2.12 1.8 15 51.4 203. 383. 529
É possível colocar as colunas no primeiro e no último lugar rapidamente com columns_to_first()
e columns_to_last()
, respectivamente.
column_to_first(maize, CESP, DIES) %>% head()
# # A tibble: 6 x 10
# CESP DIES AMB HIB REP APLA AIES MGRA MMG NGRA
# <dbl> <dbl> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 16.9 52.1 A1 H1 I 2.45 2.39 228. 375. 609
# 2 14.4 50.7 A1 H1 I 2.5 1.43 187. 437. 427
# 3 16.5 54.7 A1 H1 I 2.69 1.52 230. 464. 497
# 4 16.8 52.0 A1 H1 I 2.8 1.64 213. 408. 523
# 5 15.9 51.6 A1 H1 I 2.62 1.55 224. 406. 551
# 6 15 51.4 A1 H1 II 2.12 1.8 203. 383. 529
7.1.9 Obtendo níveis de fatores
Para obter os níveis e o tamanho dos níveis de um fator, as funções get_levels()
e get_level_size()
pode ser usado.
get_levels(maize, AMB)
# [1] "A1" "A2" "A3" "A4"
get_level_size(maize, AMB)
# # A tibble: 4 x 10
# AMB HIB REP APLA AIES CESP DIES MGRA MMG NGRA
# * <chr> <int> <int> <int> <int> <int> <int> <int> <int> <int>
# 1 A1 195 195 195 195 195 195 195 195 195
# 2 A2 195 195 195 195 195 195 195 195 195
# 3 A3 195 195 195 195 195 195 195 195 195
# 4 A4 195 195 195 195 195 195 195 195 195
7.1.10 Selecionar linhas com base em seus valores
Utilizando a função filter()
é possivel filtrar as linhas de um conjunto de dados com base no valor de suas variáveis. No primeiro exemplo, selecionaremos as linhas onde o valor da variável MGRA é maior que 280.
maize %>%
filter(MGRA > 280)
# # A tibble: 4 x 10
# AMB HIB REP APLA AIES CESP DIES MGRA MMG NGRA
# <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A1 H6 I 2.92 1.64 18 56.0 289. 393. 734
# 2 A1 H10 I 2.92 1.61 20.3 55.4 283. 441. 641
# 3 A1 H13 II 2.47 1.28 15.3 53.0 291. 417. 698
# 4 A4 H10 I 2.65 1.47 14 50.3 287. 275. 493
No segundo exemplo, selecionaremos apenas as linhas onde a MGRA é maior que 220 OU a APLA é menor que 1.3 OU o NGRA é maior que 820.
maize %>%
filter(MGRA > 280 | APLA < 1.3 | NGRA > 820)
# # A tibble: 10 x 10
# AMB HIB REP APLA AIES CESP DIES MGRA MMG NGRA
# <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A1 H6 I 2.92 1.64 18 56.0 289. 393. 734
# 2 A1 H10 I 2.92 1.61 20.3 55.4 283. 441. 641
# 3 A1 H13 II 2.47 1.28 15.3 53.0 291. 417. 698
# 4 A2 H8 II 1.03 0.69 10.8 44.8 94.8 277. 342
# 5 A2 H10 III 1.09 0.92 15 47.6 166. 299. 555
# 6 A3 H10 I 1.04 0.71 14.8 45.5 112. 265. 423
# 7 A3 H11 I 1 0.65 14.5 43.6 120. 210. 571
# 8 A4 H8 I 2.65 1.67 18 50 277. 251. 903
# 9 A4 H8 I 2.95 1.7 18.6 52.9 249. 302. 824
# 10 A4 H10 I 2.65 1.47 14 50.3 287. 275. 493
No último exemplo, selecionaremos apenas as linhas onde MGRA é maior que é maior que 220 E a APLA é menor que 2.
maize %>%
filter(MGRA > 220 & APLA < 2)
# # A tibble: 1 x 10
# AMB HIB REP APLA AIES CESP DIES MGRA MMG NGRA
# <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A1 H6 II 1.97 1.63 17.1 54.7 230. 375. 614
Isto é aproximadamente equivalente ao seguinte código R base.
maize[maize$MGRA > 220 & maize$APLA < 2, ]
7.2 Trabalhando com números e seqüências de caracteres
7.2.1 Arredondando
A função round_cols()
arredonda uma coluna selecionada ou um quadro de dados inteiro para o número especificado de casas decimais (padrão 0). Se nenhuma variável for informada, todas as variáveis numéricas serão arredondadas.
round_cols(maize)
# # A tibble: 780 x 10
# AMB HIB REP APLA AIES CESP DIES MGRA MMG NGRA
# <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A1 H1 I 2.45 2.39 16.9 52.1 228. 375. 609
# 2 A1 H1 I 2.5 1.43 14.4 50.7 187. 437. 427
# 3 A1 H1 I 2.69 1.52 16.5 54.7 230. 464. 497
# 4 A1 H1 I 2.8 1.64 16.8 52.0 214. 408. 523
# 5 A1 H1 I 2.62 1.55 15.9 51.6 224. 406. 551
# 6 A1 H1 II 2.12 1.8 15 51.4 203. 383. 529
# 7 A1 H1 II 3.15 1.78 10.9 41.9 75.2 256. 294
# 8 A1 H1 II 2.97 1.84 15 53.4 204. 387. 528
# 9 A1 H1 II 3.1 1.78 13.6 50.8 187. 348. 538
# 10 A1 H1 II 3.02 1.6 16.3 53.9 250. 430. 582
# # ... with 770 more rows
Como alternativa, selecione variáveis para arredondar.
round_cols(maize, MGRA, MMG, digits = 1)
# # A tibble: 780 x 10
# AMB HIB REP APLA AIES CESP DIES MGRA MMG NGRA
# <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A1 H1 I 2.45 2.39 16.9 52.1 228. 375 609
# 2 A1 H1 I 2.5 1.43 14.4 50.7 187. 437. 427
# 3 A1 H1 I 2.69 1.52 16.5 54.7 230. 464. 497
# 4 A1 H1 I 2.8 1.64 16.8 52.0 214. 408. 523
# 5 A1 H1 I 2.62 1.55 15.9 51.6 224. 406 551
# 6 A1 H1 II 2.12 1.8 15 51.4 203. 383. 529
# 7 A1 H1 II 3.15 1.78 10.9 41.9 75.2 256. 294
# 8 A1 H1 II 2.97 1.84 15 53.4 204. 387. 528
# 9 A1 H1 II 3.1 1.78 13.6 50.8 187. 348. 538
# 10 A1 H1 II 3.02 1.6 16.3 53.9 250. 430. 582
# # ... with 770 more rows
7.2.2 Extraindo e substituindo números
As funções extract_number()
e replace_number()
pode ser usado para extrair ou substituir números. Como exemplo, extrairemos o número de cada genótipo em maize
criando uma nova coluna, HIB_NUM
, inserindo após a coluna HIB
.
maize %>%
add_cols(HIB_NUM = extract_number(HIB),
.after = HIB)
# # A tibble: 780 x 11
# AMB HIB HIB_NUM REP APLA AIES CESP DIES MGRA MMG NGRA
# <chr> <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A1 H1 1 I 2.45 2.39 16.9 52.1 228. 375. 609
# 2 A1 H1 1 I 2.5 1.43 14.4 50.7 187. 437. 427
# 3 A1 H1 1 I 2.69 1.52 16.5 54.7 230. 464. 497
# 4 A1 H1 1 I 2.8 1.64 16.8 52.0 213. 408. 523
# 5 A1 H1 1 I 2.62 1.55 15.9 51.6 224. 406. 551
# 6 A1 H1 1 II 2.12 1.8 15 51.4 203. 383. 529
# 7 A1 H1 1 II 3.15 1.78 10.9 41.9 75.2 256. 294
# 8 A1 H1 1 II 2.97 1.84 15 53.4 204. 387. 528
# 9 A1 H1 1 II 3.1 1.78 13.6 50.8 187. 348. 538
# 10 A1 H1 1 II 3.02 1.6 16.3 53.9 250. 430. 582
# # ... with 770 more rows
Para substituir números de uma determinada coluna por uma substituição especificada, use replace_number()
. Por padrão, os números são substituídos por "". O argumento drop
epull
também podem ser usados, como mostrado acima.
replace_number(maize, HIB)
# # A tibble: 780 x 10
# AMB HIB REP APLA AIES CESP DIES MGRA MMG NGRA
# <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A1 H I 2.45 2.39 16.9 52.1 228. 375. 609
# 2 A1 H I 2.5 1.43 14.4 50.7 187. 437. 427
# 3 A1 H I 2.69 1.52 16.5 54.7 230. 464. 497
# 4 A1 H I 2.8 1.64 16.8 52.0 213. 408. 523
# 5 A1 H I 2.62 1.55 15.9 51.6 224. 406. 551
# 6 A1 H II 2.12 1.8 15 51.4 203. 383. 529
# 7 A1 H II 3.15 1.78 10.9 41.9 75.2 256. 294
# 8 A1 H II 2.97 1.84 15 53.4 204. 387. 528
# 9 A1 H II 3.1 1.78 13.6 50.8 187. 348. 538
# 10 A1 H II 3.02 1.6 16.3 53.9 250. 430. 582
# # ... with 770 more rows
replace_number(maize,
REP,
pattern = "^I$",
replacement = "REP_1")
# # A tibble: 780 x 10
# AMB HIB REP APLA AIES CESP DIES MGRA MMG NGRA
# <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A1 H1 REP_1 2.45 2.39 16.9 52.1 228. 375. 609
# 2 A1 H1 REP_1 2.5 1.43 14.4 50.7 187. 437. 427
# 3 A1 H1 REP_1 2.69 1.52 16.5 54.7 230. 464. 497
# 4 A1 H1 REP_1 2.8 1.64 16.8 52.0 213. 408. 523
# 5 A1 H1 REP_1 2.62 1.55 15.9 51.6 224. 406. 551
# 6 A1 H1 II 2.12 1.8 15 51.4 203. 383. 529
# 7 A1 H1 II 3.15 1.78 10.9 41.9 75.2 256. 294
# 8 A1 H1 II 2.97 1.84 15 53.4 204. 387. 528
# 9 A1 H1 II 3.1 1.78 13.6 50.8 187. 348. 538
# 10 A1 H1 II 3.02 1.6 16.3 53.9 250. 430. 582
# # ... with 770 more rows
7.2.3 Extraindo, substituindo e removendo strings
As funções extract_string()
e replace_string()
são usados no mesmo contexto de extract_number()
e replace_number()
, mas para lidar com seqüências de caracteres.
extract_string(maize, HIB)
# # A tibble: 780 x 10
# AMB HIB REP APLA AIES CESP DIES MGRA MMG NGRA
# <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A1 H I 2.45 2.39 16.9 52.1 228. 375. 609
# 2 A1 H I 2.5 1.43 14.4 50.7 187. 437. 427
# 3 A1 H I 2.69 1.52 16.5 54.7 230. 464. 497
# 4 A1 H I 2.8 1.64 16.8 52.0 213. 408. 523
# 5 A1 H I 2.62 1.55 15.9 51.6 224. 406. 551
# 6 A1 H II 2.12 1.8 15 51.4 203. 383. 529
# 7 A1 H II 3.15 1.78 10.9 41.9 75.2 256. 294
# 8 A1 H II 2.97 1.84 15 53.4 204. 387. 528
# 9 A1 H II 3.1 1.78 13.6 50.8 187. 348. 538
# 10 A1 H II 3.02 1.6 16.3 53.9 250. 430. 582
# # ... with 770 more rows
Para substituir strings, podemos usar a função replace_strings()
.
replace_string(maize,
HIB,
replacement = "HIB_")
# # A tibble: 780 x 10
# AMB HIB REP APLA AIES CESP DIES MGRA MMG NGRA
# <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A1 HIB_1 I 2.45 2.39 16.9 52.1 228. 375. 609
# 2 A1 HIB_1 I 2.5 1.43 14.4 50.7 187. 437. 427
# 3 A1 HIB_1 I 2.69 1.52 16.5 54.7 230. 464. 497
# 4 A1 HIB_1 I 2.8 1.64 16.8 52.0 213. 408. 523
# 5 A1 HIB_1 I 2.62 1.55 15.9 51.6 224. 406. 551
# 6 A1 HIB_1 II 2.12 1.8 15 51.4 203. 383. 529
# 7 A1 HIB_1 II 3.15 1.78 10.9 41.9 75.2 256. 294
# 8 A1 HIB_1 II 2.97 1.84 15 53.4 204. 387. 528
# 9 A1 HIB_1 II 3.1 1.78 13.6 50.8 187. 348. 538
# 10 A1 HIB_1 II 3.02 1.6 16.3 53.9 250. 430. 582
# # ... with 770 more rows
Para remover todas as seqüências de caracteres de um quadro de dados, use remove_strings()
.
remove_strings(maize)
# # A tibble: 780 x 10
# AMB HIB REP APLA AIES CESP DIES MGRA MMG NGRA
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 1 1 NA 2.45 2.39 16.9 52.1 228. 375. 609
# 2 1 1 NA 2.5 1.43 14.4 50.7 187. 437. 427
# 3 1 1 NA 2.69 1.52 16.5 54.7 230. 464. 497
# 4 1 1 NA 2.8 1.64 16.8 52.0 213. 408. 523
# 5 1 1 NA 2.62 1.55 15.9 51.6 224. 406. 551
# 6 1 1 NA 2.12 1.8 15 51.4 203. 383. 529
# 7 1 1 NA 3.15 1.78 10.9 41.9 75.2 256. 294
# 8 1 1 NA 2.97 1.84 15 53.4 204. 387. 528
# 9 1 1 NA 3.1 1.78 13.6 50.8 187. 348. 538
# 10 1 1 NA 3.02 1.6 16.3 53.9 250. 430. 582
# # ... with 770 more rows
7.2.4 Formatando strings
A função tidy_strings()
organiza cadeias de caracteres, colunas não numéricas ou quaisquer colunas selecionadas em um quadro de dados, colocando todas as palavras em maiúsculas, substituindo qualquer espaço, tabulação e caracteres de pontuação por _
e colocando _
entre letras maiúsculas e minúsculas. Considere as seguintes cadeias de caracteres: messy_env
por definição deve representar um nível único do ambiente de fator (ambiente 1). messy_gen
mostra seis genótipos, emessy_int
representa a interação desses genótipos com o ambiente 1.
messy_env <- c("ENV 1", "Env 1", "Env1", "env1", "Env.1", "Env_1")
messy_gen <- c("GEN1", "gen 2", "Gen.3", "gen-4", "Gen_5", "GEN_6")
messy_int <- c("Env1Gen1", "Env1_Gen2", "env1 gen3", "Env1 Gen4", "ENV_1GEN5", "ENV1GEN6")
Esses vetores de caracteres são visualmente confusos. Vamos arrumá-los.
tidy_strings(messy_env)
# [1] "ENV_1" "ENV_1" "ENV_1" "ENV_1" "ENV_1" "ENV_1"
tidy_strings(messy_gen)
# [1] "GEN_1" "GEN_2" "GEN_3" "GEN_4" "GEN_5" "GEN_6"
tidy_strings(messy_int)
# [1] "ENV_1_GEN_1" "ENV_1_GEN_2" "ENV_1_GEN_3" "ENV_1_GEN_4" "ENV_1_GEN_5"
# [6] "ENV_1_GEN_6"
O tidy_strings()
também funciona para arrumar um quadro de dados inteiro ou colunas específicas. Vamos criar um quadro de dados ‘bagunçado’ no contexto de testes de melhoramento de plantas.
library(tibble)
df <- tibble(Env = messy_env,
gen = messy_gen,
Env_GEN = interaction(Env, gen),
y = rnorm (6, 300, 10))
df
# # A tibble: 6 x 4
# Env gen Env_GEN y
# <chr> <chr> <fct> <dbl>
# 1 ENV 1 GEN1 ENV 1.GEN1 294.
# 2 Env 1 gen 2 Env 1.gen 2 300.
# 3 Env1 Gen.3 Env1.Gen.3 291.
# 4 env1 gen-4 env1.gen-4 302.
# 5 Env.1 Gen_5 Env.1.Gen_5 293.
# 6 Env_1 GEN_6 Env_1.GEN_6 318.
tidy_strings(df)
# # A tibble: 6 x 4
# Env gen Env_GEN y
# <chr> <chr> <chr> <dbl>
# 1 ENV_1 GEN_1 ENV_1_GEN_1 294.
# 2 ENV_1 GEN_2 ENV_1_GEN_2 300.
# 3 ENV_1 GEN_3 ENV_1_GEN_3 291.
# 4 ENV_1 GEN_4 ENV_1_GEN_4 302.
# 5 ENV_1 GEN_5 ENV_1_GEN_5 293.
# 6 ENV_1 GEN_6 ENV_1_GEN_6 318.
tidy_strings(df, gen)
# # A tibble: 6 x 4
# Env gen Env_GEN y
# <chr> <chr> <fct> <dbl>
# 1 ENV 1 GEN_1 ENV 1.GEN1 294.
# 2 Env 1 GEN_2 Env 1.gen 2 300.
# 3 Env1 GEN_3 Env1.Gen.3 291.
# 4 env1 GEN_4 env1.gen-4 302.
# 5 Env.1 GEN_5 Env.1.Gen_5 293.
# 6 Env_1 GEN_6 Env_1.GEN_6 318.
7.3 Selecionar linhas por sua posição
A função slice()
é usada para selecionar linhas por sua posição ordinal no tibble. Os tibbles agrupados usam a posição ordinal dentro do grupo.
# seleciona as três primeiras linhas
slice(maize, 1:3)
# # A tibble: 3 x 10
# AMB HIB REP APLA AIES CESP DIES MGRA MMG NGRA
# <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A1 H1 I 2.45 2.39 16.9 52.1 228. 375. 609
# 2 A1 H1 I 2.5 1.43 14.4 50.7 187. 437. 427
# 3 A1 H1 I 2.69 1.52 16.5 54.7 230. 464. 497
# Seleciona as 3 últimas linhas
slice(maize, 778:n())
# # A tibble: 3 x 10
# AMB HIB REP APLA AIES CESP DIES MGRA MMG NGRA
# <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A4 H13 III 2.2 0.9 12.1 40.9 92.8 322. 288
# 2 A4 H13 III 2.15 1.07 10.6 46.0 91.4 300. 305
# 3 A4 H13 III 2.19 1.12 14.5 51.9 144. 352. 408
# seleciona as duas primeiras linhas de cada ambiente
maize %>%
group_by(AMB) %>%
slice(1:2)
# # A tibble: 8 x 10
# # Groups: AMB [4]
# AMB HIB REP APLA AIES CESP DIES MGRA MMG NGRA
# <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A1 H1 I 2.45 2.39 16.9 52.1 228. 375. 609
# 2 A1 H1 I 2.5 1.43 14.4 50.7 187. 437. 427
# 3 A2 H1 I 3.06 1.89 18.2 54.4 244. 421. 581
# 4 A2 H1 I 3.04 1.89 15.4 53.4 193. 369. 523
# 5 A3 H1 I 2.12 1.03 18.5 52.0 214. 382. 560
# 6 A3 H1 I 2 1.05 19.9 53.3 253. 444. 570
# 7 A4 H1 I 2.13 1.1 12.8 47.6 144. 280. 516
# 8 A4 H1 I 2.3 1.25 13.1 50.0 140. 230. 609
7.4 Combinando os verbos para manipulação
Esta sessão tem o objetivo de demonstrar como os verbos dplyr em conjunto com as funções pivot_longer()
do pacote tidyr21 e column_to_rownames()
do pacote tibble22 podem ser combinados para construir uma matriz dupla entrada onde as linhas correspondem aos genótipos e as colunas correspondem aos ambientes. Esta matriz será preenchida com o valor médio da MGRA considerando apenas as duas primeiras repetições de cada híbrido em cada ambiente.
maize %>%
filter(REP %in% c("I", "II")) %>%
group_by(AMB, HIB) %>%
summarise(MGRA_me = mean(MGRA)) %>%
pivot_wider(names_from = HIB, values_from = MGRA_me) %>%
round_cols(digits = 1)
# # A tibble: 4 x 14
# # Groups: AMB [4]
# AMB H1 H10 H11 H12 H13 H2 H3 H4 H5 H6 H7 H8
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 A1 200. 185. 199. 174. 222. 205. 201. 204. 190. 238. 185. 198.
# 2 A2 194. 151. 169. 136. 158. 219. 201. 193. 180. 204. 148. 116
# 3 A3 147. 117 127. 153. 186. 161. 146. 150 147. 127. 146. 149.
# 4 A4 195. 180. 170. 191. 167 156. 148. 182. 209. 164. 195. 182.
# # ... with 1 more variable: H9 <dbl>
Note que a mesma tabela dupla entrada pode ser obtida com a função make_mat()
do pacote metan
.
maize %>%
filter(REP %in% c("I", "II")) %>%
make_mat(AMB, HIB, MGRA) %>%
round_cols(digits = 1)
# H1 H10 H11 H12 H13 H2 H3 H4 H5 H6 H7 H8
# A1 200.2 185.1 199.3 174.5 221.9 204.9 201.3 204.4 189.5 238.2 184.8 198.2
# A2 193.8 151.3 168.7 136.2 158.3 218.8 200.6 193.3 180.1 204.5 148.2 116.0
# A3 147.2 117.0 127.1 153.1 186.5 160.6 146.4 150.0 147.1 127.4 146.4 148.7
# A4 195.2 179.5 169.5 190.9 167.0 155.5 147.7 182.1 208.7 164.3 195.4 181.9
# H9
# A1 203.4
# A2 107.2
# A3 117.3
# A4 154.8
7.5 Trabalhando com duas tabelas ao mesmo tempo
7.5.1 Junções com mutação de dados
É raro que uma análise de dados envolva apenas uma única tabela de dados. Na prática, diversas tabela podem existir e ferramentas flexíveis para combiná-las são necessárias. No dplyr, existem três famílias de verbos que permitem trabalhar com duas tabelas ao mesmo tempo, permitindo: (i) juntar tabelas, (ii) Filtrar registros e (iii) realizar operações.
Os seguintes códigos criam três novos conjuntos de dados. maize2 contém dados de duas repetições para os híbridos H1:H5 nos ambientes H1 e H2. mean_h e mean_a contém as médias para os híbridos e ambientes, respectivamente.
maize_small <-
maize %>%
filter(HIB %in% c("H1", "H2", "H3")) %>%
filter(AMB %in% c("A1", "A2"))
maize2 <-
maize_small %>%
means_by(AMB, HIB) %>%
select(AMB:APLA) %>%
round_cols(digits = 1)
maize2
# # A tibble: 6 x 3
# AMB HIB APLA
# <chr> <chr> <dbl>
# 1 A1 H1 2.7
# 2 A1 H2 2.8
# 3 A1 H3 2.9
# 4 A2 H1 2.9
# 5 A2 H2 2.9
# 6 A2 H3 2.9
mean_h <-
maize_small %>%
means_by(HIB) %>%
select(HIB, contains("A")) %>%
round_cols(digits = 1)
mean_h
# # A tibble: 3 x 5
# HIB APLA AIES MGRA NGRA
# <chr> <dbl> <dbl> <dbl> <dbl>
# 1 H1 2.8 1.7 195. 506.
# 2 H2 2.9 1.5 211. 577.
# 3 H3 2.9 1.7 195. 542.
mean_a <-
maize_small %>%
means_by(AMB) %>%
select(AMB, contains("ES")) %>%
round_cols(digits = 1)
mean_a
# # A tibble: 2 x 4
# AMB AIES CESP DIES
# <chr> <dbl> <dbl> <dbl>
# 1 A1 1.5 15.3 51.6
# 2 A2 1.8 15.4 51.8
- Juntando a coluna MGRA e NGRA da tabela mean_h na tabela maize2 considerando as variáveis com mesmo nome nas duas tabelas (neste caso, HIB)
left_join(maize2, mean_h %>% select(HIB, MGRA, NGRA), by = "HIB")
# # A tibble: 6 x 5
# AMB HIB APLA MGRA NGRA
# <chr> <chr> <dbl> <dbl> <dbl>
# 1 A1 H1 2.7 195. 506.
# 2 A1 H2 2.8 211. 577.
# 3 A1 H3 2.9 195. 542.
# 4 A2 H1 2.9 195. 506.
# 5 A2 H2 2.9 211. 577.
# 6 A2 H3 2.9 195. 542.
- Juntando as colunas da tabela mean_a na tabela maize2
full_join(maize2, mean_a, by = "AMB")
# # A tibble: 6 x 6
# AMB HIB APLA AIES CESP DIES
# <chr> <chr> <dbl> <dbl> <dbl> <dbl>
# 1 A1 H1 2.7 1.5 15.3 51.6
# 2 A1 H2 2.8 1.5 15.3 51.6
# 3 A1 H3 2.9 1.5 15.3 51.6
# 4 A2 H1 2.9 1.8 15.4 51.8
# 5 A2 H2 2.9 1.8 15.4 51.8
# 6 A2 H3 2.9 1.8 15.4 51.8
7.5.2 Junções com filtragem de dados
- Filtrando as linhas da tabela maize2 com base nas variáveis que combinam na tabela mean_h (neste caso, a coluna HIB)
semi_join(maize2, mean_h, by = c("HIB", "APLA"))
# # A tibble: 3 x 3
# AMB HIB APLA
# <chr> <chr> <dbl>
# 1 A1 H3 2.9
# 2 A2 H2 2.9
# 3 A2 H3 2.9
- Filtrando as linhas da tabela maize2 com base nas variáveis que NÃO combinam na tabela mean_h (neste caso, a coluna HIB)
7.5.3 Operações com conjuntos (vetores)
Operações com conjuntos são importantes na análise de dados agronômicos. Por exemplo, se um genótipo foi selecionado por um determinado índice nos ambientes A, B e C, então, este determinado genótipo é a interseção dos ambientes A, B e C. A base R fornece funções para operações de conjunto, mas funciona com dois conjuntos de uma vez apenas. Vamos ver como podemos estimar a interseção de três conjuntos com funções R de base.
(A <- letters[1:4])
# [1] "a" "b" "c" "d"
(B <- letters[2:5])
# [1] "b" "c" "d" "e"
(C <- letters[3:7])
# [1] "c" "d" "e" "f" "g"
(D <- letters[1:12])
# [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l"
set_lits <- list(A = A, B = B, C = C, D = D)
# intersecção de A, B e C
intersect(intersect(A, B), C)
# [1] "c" "d"
Observe que precisamos chamar intersect()
várias vezes neste caso. O novo grupo de funções set_union()
, set_difference()
e set_intersect()
do pacote metan
supera o problema de computação de união, interseção e diferenças de dois conjuntos apenas com as funções de base R.
# Intersecção de A e B
set_intersect(A, B)
# [1] "b" "c" "d"
# Intersecção de A, B e C
set_intersect(A, B, C)
# [1] "c" "d"
# União de todos os conjuntos
# Todas as funções entendem um objeto de classe lista
set_union(set_lits)
# [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l"
# Intersecção de todos os conjuntos
set_intersect(set_lits)
# [1] "c" "d"
7.5.4 Operações com conjuntos (data frames)
Nesta seção será demonstrado como é possivel utilizar operações de cojuntos como interseção e união. É esperado que as entradas x e y tenham as mesmas variáveis. Para isto, vamos criar dois novos conjuntos de dados chamados data_1_to_5 e data_3_to_10, quais contém, respectivamente as cinco primeiras linhas
e as linhas 3 a 10 de maize. Note que a função slice()
é utilizada para selecionar as linhas com base em sua posição.
library(tidyverse)
data_1_to_5 <-
maize %>%
slice(1:5) %>%
add_cols(id = 1:5, .before = 1)
data_3_to_10 <-
maize %>%
slice(3:10) %>%
add_cols(id = 3:10, .before = 1)
7.5.4.1 Interseção de conjuntos
A função set_intersect()
(interseção de conjunto) retorna somente as linhas presentes nos dois conjuntos, neste caso, as linhas 3, 4 and 5 do conjunto maize
set_intersect(data_1_to_5, data_3_to_10)
# # A tibble: 3 x 11
# id AMB HIB REP APLA AIES CESP DIES MGRA MMG NGRA
# <int> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 3 A1 H1 I 2.69 1.52 16.5 54.7 230. 464. 497
# 2 4 A1 H1 I 2.8 1.64 16.8 52.0 213. 408. 523
# 3 5 A1 H1 I 2.62 1.55 15.9 51.6 224. 406. 551
7.5.4.2 União de conjuntos
A função set_union()
(união de conjunto) junta os dois conjuntos sem que haja duplicação de registros.
set_union(data_1_to_5, data_3_to_10)
# # A tibble: 10 x 11
# id AMB HIB REP APLA AIES CESP DIES MGRA MMG NGRA
# <int> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 1 A1 H1 I 2.45 2.39 16.9 52.1 228. 375. 609
# 2 2 A1 H1 I 2.5 1.43 14.4 50.7 187. 437. 427
# 3 3 A1 H1 I 2.69 1.52 16.5 54.7 230. 464. 497
# 4 4 A1 H1 I 2.8 1.64 16.8 52.0 213. 408. 523
# 5 5 A1 H1 I 2.62 1.55 15.9 51.6 224. 406. 551
# 6 6 A1 H1 II 2.12 1.8 15 51.4 203. 383. 529
# 7 7 A1 H1 II 3.15 1.78 10.9 41.9 75.2 256. 294
# 8 8 A1 H1 II 2.97 1.84 15 53.4 204. 387. 528
# 9 9 A1 H1 II 3.1 1.78 13.6 50.8 187. 348. 538
# 10 10 A1 H1 II 3.02 1.6 16.3 53.9 250. 430. 582
7.5.4.3 Diferença de conjuntos
A função set_difference()
(diferença de conjunto, ou complementar) cria uma tabela somente com os registros em data_1_to_5 que não estão em data_3_to_10.
set_difference(data_1_to_5, data_3_to_10)
# # A tibble: 2 x 11
# id AMB HIB REP APLA AIES CESP DIES MGRA MMG NGRA
# <int> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 1 A1 H1 I 2.45 2.39 16.9 52.1 228. 375. 609
# 2 2 A1 H1 I 2.5 1.43 14.4 50.7 187. 437. 427