Dr. em Botânica (INPA)
Analista de dados
@ricoperdiz
@ricoperdiz
ricardoperdiz.com
ricoperdiz@gmail.com
plot(mtcars$hp, mtcars$mpg)plot(mpg ~ hp, data = mtcars)library(lattice)xyplot(mpg ~ hp, data = mtcars)library(ggplot2)ggplot(mtcars, aes(x = hp, y = mpg)) + geom_point()
Várias maneiras de se fazer algo em R, todas com vantagens e desvantagens. O guia de desenvolvedor do Python afirma: R é muito diferente de Python nesse aspecto. Uma vantagem da diversidade de interfaces do R é que ela pode se desenvolver com o tempo e se ajustar às diferentes necessidades dos usuários.
data.frame(a = 1:10, b = 1:10)
data.frame( a = 1:10, b = 1:10)
nir_data
1, que acompanha o pacote NIRtools
2.nir_data
1, que acompanha o pacote NIRtools
2.Perdiz (2020) Delimitação específica e filogeografia do complexo Protium aracouchini (Aubl.) Marchand (Burseraceae). Tese de doutorado. Programa de pós-graduação em Ciências Biológicas, INPA, Manaus, Amazonas, Brasil. https://repositorio.inpa.gov.br/handle/1/36948
Perdiz (2021) https://github.com/ricoperdiz/NIRtools
Vou utilizar o conjunto de dados nir_data
, um subconjunto proveniente de minha tese de doutorado (Perdiz 2020), e que acompanha o pacote NIRtools
(Perdiz 2021) para servir como exemplo para as análises neste tutorial.
Vale ressaltar que esse conjunto de dados é extremamente pequeno, por isso desconsidere os resultados das análises.
Ele servirá apenas de guia para abordar os procedimentos aqui abordados.
nir_data
1Para ler o conjunto de dados que utilizarei nesta oficina, basta rodar o comando abaixo:
dados <- read.table("https://raw.githubusercontent.com/ricoperdiz/NIRtools/master/inst/extdata/nir_data.csv", sep = "\t", header = TRUE, as.is = TRUE)
nir_data
1Para ler o conjunto de dados que utilizarei nesta oficina, basta rodar o comando abaixo:
dados <- read.table("https://raw.githubusercontent.com/ricoperdiz/NIRtools/master/inst/extdata/nir_data.csv", sep = "\t", header = TRUE, as.is = TRUE)
De maneira alternativa, você pode ler estes dados utilizando a função fread()
do pacote data.table
:
library("data.table")dados <- fread("https://raw.githubusercontent.com/ricoperdiz/NIRtools/master/inst/extdata/nir_data.csv")
De maneira alternativa, como no exemplo anterior, você pode utilizar a função fread()
do pacote data.table
. Esta função não exige a especificação do separador, pois é automaticamente descoberto:
library("data.table")dados <- fread("MEUSDADOS.csv")
data.frame
em um tibble
1library("tibble")dados <- as_tibble(dados)head(dados)
## # A tibble: 6 × 1,562## especimenid SP1 face coletor number X10001.03 X3999.64 X4003.497## <int> <chr> <chr> <chr> <int> <dbl> <dbl> <dbl>## 1 10194 P. aracou… abax… Perdiz… 2856 0.278 0.596 0.596## 2 10194 P. aracou… adax… Perdiz… 2856 0.254 0.567 0.567## 3 10194 P. aracou… abax… Perdiz… 2856 0.273 0.581 0.582## 4 10194 P. aracou… adax… Perdiz… 2856 0.258 0.576 0.577## 5 10194 P. aracou… abax… Perdiz… 2856 0.278 0.596 0.596## 6 10194 P. aracou… adax… Perdiz… 2856 0.254 0.567 0.567## # … with 1,554 more variables: X4007.354 <dbl>, X4011.211 <dbl>,## # X4015.068 <dbl>, X4018.925 <dbl>, X4022.781 <dbl>, X4026.638 <dbl>,## # X4030.495 <dbl>, X4034.352 <dbl>, X4038.209 <dbl>, X4042.066 <dbl>,## # X4045.923 <dbl>, X4049.78 <dbl>, X4053.637 <dbl>, X4057.494 <dbl>,## # X4061.351 <dbl>, X4065.208 <dbl>, X4069.065 <dbl>, X4072.922 <dbl>,## # X4076.779 <dbl>, X4080.635 <dbl>, X4084.492 <dbl>, X4088.349 <dbl>,## # X4092.206 <dbl>, X4096.063 <dbl>, X4099.92 <dbl>, X4103.777 <dbl>, …
tibble
em https://r4ds.had.co.nz/tibbles.html. Primeiras 10 linhas e 5 colunas
dados[1:10, 1:5]
## # A tibble: 10 × 5## especimenid SP1 face coletor number## <int> <chr> <chr> <chr> <int>## 1 10194 P. aracouchini abaxial Perdiz, R.O. 2856## 2 10194 P. aracouchini adaxial Perdiz, R.O. 2856## 3 10194 P. aracouchini abaxial Perdiz, R.O. 2856## 4 10194 P. aracouchini adaxial Perdiz, R.O. 2856## 5 10194 P. aracouchini abaxial Perdiz, R.O. 2856## 6 10194 P. aracouchini adaxial Perdiz, R.O. 2856## 7 10194 P. aracouchini abaxial Perdiz, R.O. 2856## 8 10194 P. aracouchini adaxial Perdiz, R.O. 2856## 9 10196 P. aracouchini abaxial Perdiz, R.O. 2858## 10 10196 P. aracouchini adaxial Perdiz, R.O. 2858
str(dados[, 1:15])
## tibble [48 × 15] (S3: tbl_df/tbl/data.frame)## $ especimenid: int [1:48] 10194 10194 10194 10194 10194 10194 10194 10194 10196 10196 ...## $ SP1 : chr [1:48] "P. aracouchini" "P. aracouchini" "P. aracouchini" "P. aracouchini" ...## $ face : chr [1:48] "abaxial" "adaxial" "abaxial" "adaxial" ...## $ coletor : chr [1:48] "Perdiz, R.O." "Perdiz, R.O." "Perdiz, R.O." "Perdiz, R.O." ...## $ number : int [1:48] 2856 2856 2856 2856 2856 2856 2856 2856 2858 2858 ...## $ X10001.03 : num [1:48] 0.278 0.254 0.273 0.258 0.278 ...## $ X3999.64 : num [1:48] 0.596 0.567 0.581 0.576 0.596 ...## $ X4003.497 : num [1:48] 0.596 0.567 0.582 0.577 0.596 ...## $ X4007.354 : num [1:48] 0.596 0.567 0.582 0.577 0.596 ...## $ X4011.211 : num [1:48] 0.596 0.567 0.582 0.577 0.596 ...## $ X4015.068 : num [1:48] 0.596 0.567 0.581 0.576 0.596 ...## $ X4018.925 : num [1:48] 0.595 0.566 0.58 0.575 0.595 ...## $ X4022.781 : num [1:48] 0.593 0.565 0.579 0.574 0.593 ...## $ X4026.638 : num [1:48] 0.592 0.563 0.578 0.573 0.592 ...## $ X4030.495 : num [1:48] 0.59 0.562 0.576 0.571 0.59 ...## - attr(*, ".internal.selfref")=<externalptr>
SP1
é a variável que contem nome de espécie em meu conjunto de dados:
table(dados$SP1)
## ## P. aracouchini P. calanense ## 24 24
NIRtools
1Função nirdf()
2,3 converte um objeto com dados NIR em um objeto de classe nirdf
, o que permite então utilizar u método próprio para plotar em R usando a função plot()
.
nirdad <- NIRtools::nirdf( dados, category = "SP1", measure_columns = grep("^X", names(dados), value = TRUE), measure_columns_prefix = "X" )
plot(nirdad, "SP1", cex_pt = .7, cex_leg = 2, text_font = 3)
Ver tutorial em https://github.com/ricoperdiz/NIRtools para aprender a usar a função nirdad
.
Outra alternativa é utilizar os passos contidos em http://botanicaamazonica.wiki.br/labotam/doku.php?id=analises:nir:ver_spectra, de autoria do Dr. Alberto Vicentini (INPA).
Este pacote possui uma série de funções/verbos para manipular e sumarizar dados tabulados.
Não é o pacote mais rápido ou eficiente para fazer tais ações.
Porém, o uso de funções cujos nomes nos remetem às ações que efetuamos rotineiramente com dados facilita a memorização.
Somado a isso, não temos a necessidade de usar aspas nos nomes das variáveis, o que acelera a digitação.
dplyr
select()
dplyr
Seleção de colunas - select()
Ordenar linhas - arrange()
dplyr
Seleção de colunas - select()
Ordenar linhas - arrange()
Filtrar linhas - filter()
dplyr
Seleção de colunas - select()
Ordenar linhas - arrange()
Filtrar linhas - filter()
Criar novas colunas - mutate()
dplyr
Seleção de colunas - select()
Ordenar linhas - arrange()
Filtrar linhas - filter()
Criar novas colunas - mutate()
Sumarizar resultados - summarise()
dplyr
Seleção de colunas - select()
Ordenar linhas - arrange()
Filtrar linhas - filter()
Criar novas colunas - mutate()
Sumarizar resultados - summarise()
Função especial para agrupamentos - group_by()
library("MASS")library("dplyr")
library("dplyr")library("MASS")
select()
Podemos selecionar quantas colunas desejarmos.
select()
Podemos selecionar quantas colunas desejarmos.
select(dados, especimenid)
## # A tibble: 48 × 1## especimenid## <int>## 1 10194## 2 10194## 3 10194## 4 10194## 5 10194## 6 10194## 7 10194## 8 10194## 9 10196## 10 10196## # … with 38 more rows
Para selecionar uma coluna, usamos a função select().
O primeiro argumento é o nome do data.frame, dados
; a partir do segundo argumento, colocamos os nomes das colunas sem aspas.
select()
select(dados, especimenid, SP1)
## # A tibble: 48 × 2## especimenid SP1 ## <int> <chr> ## 1 10194 P. aracouchini## 2 10194 P. aracouchini## 3 10194 P. aracouchini## 4 10194 P. aracouchini## 5 10194 P. aracouchini## 6 10194 P. aracouchini## 7 10194 P. aracouchini## 8 10194 P. aracouchini## 9 10196 P. aracouchini## 10 10196 P. aracouchini## # … with 38 more rows
select()
select(dados, especimenid, SP1, coletor, number)
## # A tibble: 48 × 4## especimenid SP1 coletor number## <int> <chr> <chr> <int>## 1 10194 P. aracouchini Perdiz, R.O. 2856## 2 10194 P. aracouchini Perdiz, R.O. 2856## 3 10194 P. aracouchini Perdiz, R.O. 2856## 4 10194 P. aracouchini Perdiz, R.O. 2856## 5 10194 P. aracouchini Perdiz, R.O. 2856## 6 10194 P. aracouchini Perdiz, R.O. 2856## 7 10194 P. aracouchini Perdiz, R.O. 2856## 8 10194 P. aracouchini Perdiz, R.O. 2856## 9 10196 P. aracouchini Perdiz, R.O. 2858## 10 10196 P. aracouchini Perdiz, R.O. 2858## # … with 38 more rows
dados_1colunaremovida <- select(dados, -especimenid)head(dados_1colunaremovida)
## # A tibble: 6 × 1,561## SP1 face coletor number X10001.03 X3999.64 X4003.497 X4007.354## <chr> <chr> <chr> <int> <dbl> <dbl> <dbl> <dbl>## 1 P. aracouch… abax… Perdiz… 2856 0.278 0.596 0.596 0.596## 2 P. aracouch… adax… Perdiz… 2856 0.254 0.567 0.567 0.567## 3 P. aracouch… abax… Perdiz… 2856 0.273 0.581 0.582 0.582## 4 P. aracouch… adax… Perdiz… 2856 0.258 0.576 0.577 0.577## 5 P. aracouch… abax… Perdiz… 2856 0.278 0.596 0.596 0.596## 6 P. aracouch… adax… Perdiz… 2856 0.254 0.567 0.567 0.567## # … with 1,553 more variables: X4011.211 <dbl>, X4015.068 <dbl>,## # X4018.925 <dbl>, X4022.781 <dbl>, X4026.638 <dbl>, X4030.495 <dbl>,## # X4034.352 <dbl>, X4038.209 <dbl>, X4042.066 <dbl>, X4045.923 <dbl>,## # X4049.78 <dbl>, X4053.637 <dbl>, X4057.494 <dbl>, X4061.351 <dbl>,## # X4065.208 <dbl>, X4069.065 <dbl>, X4072.922 <dbl>, X4076.779 <dbl>,## # X4080.635 <dbl>, X4084.492 <dbl>, X4088.349 <dbl>, X4092.206 <dbl>,## # X4096.063 <dbl>, X4099.92 <dbl>, X4103.777 <dbl>, X4107.634 <dbl>, …
dados_2colunasremovidas <- select(dados, -especimenid, -SP1)head(dados_2colunasremovidas)
## # A tibble: 6 × 1,560## face coletor number X10001.03 X3999.64 X4003.497 X4007.354 X4011.211## <chr> <chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl>## 1 abaxial Perdiz,… 2856 0.278 0.596 0.596 0.596 0.596## 2 adaxial Perdiz,… 2856 0.254 0.567 0.567 0.567 0.567## 3 abaxial Perdiz,… 2856 0.273 0.581 0.582 0.582 0.582## 4 adaxial Perdiz,… 2856 0.258 0.576 0.577 0.577 0.577## 5 abaxial Perdiz,… 2856 0.278 0.596 0.596 0.596 0.596## 6 adaxial Perdiz,… 2856 0.254 0.567 0.567 0.567 0.567## # … with 1,552 more variables: X4015.068 <dbl>, X4018.925 <dbl>,## # X4022.781 <dbl>, X4026.638 <dbl>, X4030.495 <dbl>, X4034.352 <dbl>,## # X4038.209 <dbl>, X4042.066 <dbl>, X4045.923 <dbl>, X4049.78 <dbl>,## # X4053.637 <dbl>, X4057.494 <dbl>, X4061.351 <dbl>, X4065.208 <dbl>,## # X4069.065 <dbl>, X4072.922 <dbl>, X4076.779 <dbl>, X4080.635 <dbl>,## # X4084.492 <dbl>, X4088.349 <dbl>, X4092.206 <dbl>, X4096.063 <dbl>,## # X4099.92 <dbl>, X4103.777 <dbl>, X4107.634 <dbl>, X4111.491 <dbl>, …
multiplas_colunas_removidas <- select(dados, -one_of(c("especimenid", "SP1", "face")))head(multiplas_colunas_removidas)
## # A tibble: 6 × 1,559## coletor number X10001.03 X3999.64 X4003.497 X4007.354 X4011.211## <chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl>## 1 Perdiz, R.O. 2856 0.278 0.596 0.596 0.596 0.596## 2 Perdiz, R.O. 2856 0.254 0.567 0.567 0.567 0.567## 3 Perdiz, R.O. 2856 0.273 0.581 0.582 0.582 0.582## 4 Perdiz, R.O. 2856 0.258 0.576 0.577 0.577 0.577## 5 Perdiz, R.O. 2856 0.278 0.596 0.596 0.596 0.596## 6 Perdiz, R.O. 2856 0.254 0.567 0.567 0.567 0.567## # … with 1,552 more variables: X4015.068 <dbl>, X4018.925 <dbl>,## # X4022.781 <dbl>, X4026.638 <dbl>, X4030.495 <dbl>, X4034.352 <dbl>,## # X4038.209 <dbl>, X4042.066 <dbl>, X4045.923 <dbl>, X4049.78 <dbl>,## # X4053.637 <dbl>, X4057.494 <dbl>, X4061.351 <dbl>, X4065.208 <dbl>,## # X4069.065 <dbl>, X4072.922 <dbl>, X4076.779 <dbl>, X4080.635 <dbl>,## # X4084.492 <dbl>, X4088.349 <dbl>, X4092.206 <dbl>, X4096.063 <dbl>,## # X4099.92 <dbl>, X4103.777 <dbl>, X4107.634 <dbl>, X4111.491 <dbl>, …
select(dados, SP1, number, coletor)
## # A tibble: 48 × 3## SP1 number coletor ## <chr> <int> <chr> ## 1 P. aracouchini 2856 Perdiz, R.O.## 2 P. aracouchini 2856 Perdiz, R.O.## 3 P. aracouchini 2856 Perdiz, R.O.## 4 P. aracouchini 2856 Perdiz, R.O.## 5 P. aracouchini 2856 Perdiz, R.O.## 6 P. aracouchini 2856 Perdiz, R.O.## 7 P. aracouchini 2856 Perdiz, R.O.## 8 P. aracouchini 2856 Perdiz, R.O.## 9 P. aracouchini 2858 Perdiz, R.O.## 10 P. aracouchini 2858 Perdiz, R.O.## # … with 38 more rows
everything()
select(dados, coletor, number, everything())
## # A tibble: 48 × 1,562## coletor number especimenid SP1 face X10001.03 X3999.64 X4003.497## <chr> <int> <int> <chr> <chr> <dbl> <dbl> <dbl>## 1 Perdiz, R.… 2856 10194 P. a… abax… 0.278 0.596 0.596## 2 Perdiz, R.… 2856 10194 P. a… adax… 0.254 0.567 0.567## 3 Perdiz, R.… 2856 10194 P. a… abax… 0.273 0.581 0.582## 4 Perdiz, R.… 2856 10194 P. a… adax… 0.258 0.576 0.577## 5 Perdiz, R.… 2856 10194 P. a… abax… 0.278 0.596 0.596## 6 Perdiz, R.… 2856 10194 P. a… adax… 0.254 0.567 0.567## 7 Perdiz, R.… 2856 10194 P. a… abax… 0.273 0.581 0.582## 8 Perdiz, R.… 2856 10194 P. a… adax… 0.258 0.576 0.577## 9 Perdiz, R.… 2858 10196 P. a… abax… 0.274 0.681 0.681## 10 Perdiz, R.… 2858 10196 P. a… adax… 0.278 0.673 0.672## # … with 38 more rows, and 1,554 more variables: X4007.354 <dbl>,## # X4011.211 <dbl>, X4015.068 <dbl>, X4018.925 <dbl>, X4022.781 <dbl>,## # X4026.638 <dbl>, X4030.495 <dbl>, X4034.352 <dbl>, X4038.209 <dbl>,## # X4042.066 <dbl>, X4045.923 <dbl>, X4049.78 <dbl>, X4053.637 <dbl>,## # X4057.494 <dbl>, X4061.351 <dbl>, X4065.208 <dbl>, X4069.065 <dbl>,## # X4072.922 <dbl>, X4076.779 <dbl>, X4080.635 <dbl>, X4084.492 <dbl>,## # X4088.349 <dbl>, X4092.206 <dbl>, X4096.063 <dbl>, X4099.92 <dbl>, …
select()
Há verbos que auxiliam a busca das colunas desejadas. São eles:
select()
Há verbos que auxiliam a busca das colunas desejadas. São eles:
starts_with()
: Coluna começa com um prefixo X;ends_with()
: Termina com um sufixo X;contains()
: Contem uma determinada palavra;matches()
: Busca uma expressão regular (veja ?regex
);num_range()
: Busca uma amplitude numérica.starts_with()
select(dados, starts_with("col"))
## # A tibble: 48 × 1## coletor ## <chr> ## 1 Perdiz, R.O.## 2 Perdiz, R.O.## 3 Perdiz, R.O.## 4 Perdiz, R.O.## 5 Perdiz, R.O.## 6 Perdiz, R.O.## 7 Perdiz, R.O.## 8 Perdiz, R.O.## 9 Perdiz, R.O.## 10 Perdiz, R.O.## # … with 38 more rows
ends_with()
select(dados, ends_with("r"))
## # A tibble: 48 × 2## coletor number## <chr> <int>## 1 Perdiz, R.O. 2856## 2 Perdiz, R.O. 2856## 3 Perdiz, R.O. 2856## 4 Perdiz, R.O. 2856## 5 Perdiz, R.O. 2856## 6 Perdiz, R.O. 2856## 7 Perdiz, R.O. 2856## 8 Perdiz, R.O. 2856## 9 Perdiz, R.O. 2858## 10 Perdiz, R.O. 2858## # … with 38 more rows
contains()
select(dados, contains("ol"))
## # A tibble: 48 × 1## coletor ## <chr> ## 1 Perdiz, R.O.## 2 Perdiz, R.O.## 3 Perdiz, R.O.## 4 Perdiz, R.O.## 5 Perdiz, R.O.## 6 Perdiz, R.O.## 7 Perdiz, R.O.## 8 Perdiz, R.O.## 9 Perdiz, R.O.## 10 Perdiz, R.O.## # … with 38 more rows
matches()
select(dados, matches("^X[0-9]+\\.97$"))
## # A tibble: 48 × 1## X8438.97## <dbl>## 1 0.294## 2 0.271## 3 0.290## 4 0.275## 5 0.294## 6 0.271## 7 0.290## 8 0.275## 9 0.285## 10 0.290## # … with 38 more rows
num_range()
select(dados, num_range("X", seq(from = 3999.64, to = 4007.354, by = 3.857)))
## # A tibble: 48 × 3## X3999.64 X4003.497 X4007.354## <dbl> <dbl> <dbl>## 1 0.596 0.596 0.596## 2 0.567 0.567 0.567## 3 0.581 0.582 0.582## 4 0.576 0.577 0.577## 5 0.596 0.596 0.596## 6 0.567 0.567 0.567## 7 0.581 0.582 0.582## 8 0.576 0.577 0.577## 9 0.681 0.681 0.681## 10 0.673 0.672 0.672## # … with 38 more rows
distinct()
Ao selecionar diversas colunas, podemos querer ver combinações distintas de linhas.
distinct()
Ao selecionar diversas colunas, podemos querer ver combinações distintas de linhas.
Usamos então a função distinct()
para obter essas combinações:
distinct(dados, coletor, number, SP1)
## # A tibble: 6 × 3## SP1 coletor number## <chr> <chr> <int>## 1 P. aracouchini Perdiz, R.O. 2856## 2 P. aracouchini Perdiz, R.O. 2858## 3 P. aracouchini Perdiz, R.O. 2859## 4 P. calanense Perdiz, R.O. 3236## 5 P. calanense Perdiz, R.O. 3237## 6 P. calanense Perdiz, R.O. 3239
arrange()
arrange(dados, number)
## # A tibble: 48 × 1,562## especimenid SP1 face coletor number X10001.03 X3999.64 X4003.497## <int> <chr> <chr> <chr> <int> <dbl> <dbl> <dbl>## 1 10194 P. araco… abax… Perdiz… 2856 0.278 0.596 0.596## 2 10194 P. araco… adax… Perdiz… 2856 0.254 0.567 0.567## 3 10194 P. araco… abax… Perdiz… 2856 0.273 0.581 0.582## 4 10194 P. araco… adax… Perdiz… 2856 0.258 0.576 0.577## 5 10194 P. araco… abax… Perdiz… 2856 0.278 0.596 0.596## 6 10194 P. araco… adax… Perdiz… 2856 0.254 0.567 0.567## 7 10194 P. araco… abax… Perdiz… 2856 0.273 0.581 0.582## 8 10194 P. araco… adax… Perdiz… 2856 0.258 0.576 0.577## 9 10196 P. araco… abax… Perdiz… 2858 0.274 0.681 0.681## 10 10196 P. araco… adax… Perdiz… 2858 0.278 0.673 0.672## # … with 38 more rows, and 1,554 more variables: X4007.354 <dbl>,## # X4011.211 <dbl>, X4015.068 <dbl>, X4018.925 <dbl>, X4022.781 <dbl>,## # X4026.638 <dbl>, X4030.495 <dbl>, X4034.352 <dbl>, X4038.209 <dbl>,## # X4042.066 <dbl>, X4045.923 <dbl>, X4049.78 <dbl>, X4053.637 <dbl>,## # X4057.494 <dbl>, X4061.351 <dbl>, X4065.208 <dbl>, X4069.065 <dbl>,## # X4072.922 <dbl>, X4076.779 <dbl>, X4080.635 <dbl>, X4084.492 <dbl>,## # X4088.349 <dbl>, X4092.206 <dbl>, X4096.063 <dbl>, X4099.92 <dbl>, …
arrange()
arrange(dados, desc(number))
## # A tibble: 48 × 1,562## especimenid SP1 face coletor number X10001.03 X3999.64 X4003.497## <int> <chr> <chr> <chr> <int> <dbl> <dbl> <dbl>## 1 12650 P. calan… abax… Perdiz… 3239 0.349 0.733 0.733## 2 12650 P. calan… adax… Perdiz… 3239 0.342 0.744 0.744## 3 12650 P. calan… abax… Perdiz… 3239 0.342 0.713 0.714## 4 12650 P. calan… adax… Perdiz… 3239 0.355 0.773 0.773## 5 12650 P. calan… abax… Perdiz… 3239 0.349 0.733 0.733## 6 12650 P. calan… adax… Perdiz… 3239 0.342 0.744 0.744## 7 12650 P. calan… abax… Perdiz… 3239 0.342 0.713 0.714## 8 12650 P. calan… adax… Perdiz… 3239 0.355 0.773 0.773## 9 12648 P. calan… abax… Perdiz… 3237 0.402 0.745 0.746## 10 12648 P. calan… adax… Perdiz… 3237 0.389 0.757 0.757## # … with 38 more rows, and 1,554 more variables: X4007.354 <dbl>,## # X4011.211 <dbl>, X4015.068 <dbl>, X4018.925 <dbl>, X4022.781 <dbl>,## # X4026.638 <dbl>, X4030.495 <dbl>, X4034.352 <dbl>, X4038.209 <dbl>,## # X4042.066 <dbl>, X4045.923 <dbl>, X4049.78 <dbl>, X4053.637 <dbl>,## # X4057.494 <dbl>, X4061.351 <dbl>, X4065.208 <dbl>, X4069.065 <dbl>,## # X4072.922 <dbl>, X4076.779 <dbl>, X4080.635 <dbl>, X4084.492 <dbl>,## # X4088.349 <dbl>, X4092.206 <dbl>, X4096.063 <dbl>, X4099.92 <dbl>, …
filter()
filter(dados, SP1 == "P. calanense")
## # A tibble: 24 × 1,562## especimenid SP1 face coletor number X10001.03 X3999.64 X4003.497## <int> <chr> <chr> <chr> <int> <dbl> <dbl> <dbl>## 1 12647 P. calan… abax… Perdiz… 3236 0.322 0.717 0.717## 2 12647 P. calan… adax… Perdiz… 3236 0.329 0.714 0.715## 3 12647 P. calan… abax… Perdiz… 3236 0.340 0.724 0.724## 4 12647 P. calan… adax… Perdiz… 3236 0.320 0.735 0.736## 5 12647 P. calan… abax… Perdiz… 3236 0.322 0.717 0.717## 6 12647 P. calan… adax… Perdiz… 3236 0.329 0.714 0.715## 7 12647 P. calan… abax… Perdiz… 3236 0.340 0.724 0.724## 8 12647 P. calan… adax… Perdiz… 3236 0.320 0.735 0.736## 9 12648 P. calan… abax… Perdiz… 3237 0.402 0.745 0.746## 10 12648 P. calan… adax… Perdiz… 3237 0.389 0.757 0.757## # … with 14 more rows, and 1,554 more variables: X4007.354 <dbl>,## # X4011.211 <dbl>, X4015.068 <dbl>, X4018.925 <dbl>, X4022.781 <dbl>,## # X4026.638 <dbl>, X4030.495 <dbl>, X4034.352 <dbl>, X4038.209 <dbl>,## # X4042.066 <dbl>, X4045.923 <dbl>, X4049.78 <dbl>, X4053.637 <dbl>,## # X4057.494 <dbl>, X4061.351 <dbl>, X4065.208 <dbl>, X4069.065 <dbl>,## # X4072.922 <dbl>, X4076.779 <dbl>, X4080.635 <dbl>, X4084.492 <dbl>,## # X4088.349 <dbl>, X4092.206 <dbl>, X4096.063 <dbl>, X4099.92 <dbl>, …
filter(dados, SP1 == "P. calanense", number == 3237)
## # A tibble: 8 × 1,562## especimenid SP1 face coletor number X10001.03 X3999.64 X4003.497## <int> <chr> <chr> <chr> <int> <dbl> <dbl> <dbl>## 1 12648 P. calane… abax… Perdiz… 3237 0.402 0.745 0.746## 2 12648 P. calane… adax… Perdiz… 3237 0.389 0.757 0.757## 3 12648 P. calane… abax… Perdiz… 3237 0.418 0.748 0.749## 4 12648 P. calane… adax… Perdiz… 3237 0.363 0.725 0.725## 5 12648 P. calane… abax… Perdiz… 3237 0.402 0.745 0.746## 6 12648 P. calane… adax… Perdiz… 3237 0.389 0.757 0.757## 7 12648 P. calane… abax… Perdiz… 3237 0.418 0.748 0.749## 8 12648 P. calane… adax… Perdiz… 3237 0.363 0.725 0.725## # … with 1,554 more variables: X4007.354 <dbl>, X4011.211 <dbl>,## # X4015.068 <dbl>, X4018.925 <dbl>, X4022.781 <dbl>, X4026.638 <dbl>,## # X4030.495 <dbl>, X4034.352 <dbl>, X4038.209 <dbl>, X4042.066 <dbl>,## # X4045.923 <dbl>, X4049.78 <dbl>, X4053.637 <dbl>, X4057.494 <dbl>,## # X4061.351 <dbl>, X4065.208 <dbl>, X4069.065 <dbl>, X4072.922 <dbl>,## # X4076.779 <dbl>, X4080.635 <dbl>, X4084.492 <dbl>, X4088.349 <dbl>,## # X4092.206 <dbl>, X4096.063 <dbl>, X4099.92 <dbl>, X4103.777 <dbl>, …
,
em filter()
equivale a &
mutate()
nova_coluna <- mutate(dados, calanense = ifelse(SP1 == "P. calanense", 1, 0))select(nova_coluna, SP1, calanense)
## # A tibble: 48 × 2## SP1 calanense## <chr> <dbl>## 1 P. aracouchini 0## 2 P. aracouchini 0## 3 P. aracouchini 0## 4 P. aracouchini 0## 5 P. aracouchini 0## 6 P. aracouchini 0## 7 P. aracouchini 0## 8 P. aracouchini 0## 9 P. aracouchini 0## 10 P. aracouchini 0## # … with 38 more rows
summarise()
summarise(dados, media_X8438.97 = mean(X8438.97))
## # A tibble: 1 × 1## media_X8438.97## <dbl>## 1 0.327
A função summarise()
colapsa um data.frame
em uma única linha.
No entanto, a verdadeira utilidade dessa função se manifesta ao utilizarmos a função group_by
para destacar os agrupamentos que desejamos fazer dentro dos dados.
group_by
dados_agrupados <- group_by(dados, SP1)dados_agrupados[1:5, 1:10]
## # A tibble: 5 × 10## # Groups: SP1 [1]## especimenid SP1 face coletor number X10001.03 X3999.64 X4003.497## <int> <chr> <chr> <chr> <int> <dbl> <dbl> <dbl>## 1 10194 P. aracou… abax… Perdiz… 2856 0.278 0.596 0.596## 2 10194 P. aracou… adax… Perdiz… 2856 0.254 0.567 0.567## 3 10194 P. aracou… abax… Perdiz… 2856 0.273 0.581 0.582## 4 10194 P. aracou… adax… Perdiz… 2856 0.258 0.576 0.577## 5 10194 P. aracou… abax… Perdiz… 2856 0.278 0.596 0.596## # … with 2 more variables: X4007.354 <dbl>, X4011.211 <dbl>
group_by
dados_agrupados <- group_by(dados, SP1)dados_agrupados[1:5, 1:10]
## # A tibble: 5 × 10## # Groups: SP1 [1]## especimenid SP1 face coletor number X10001.03 X3999.64 X4003.497## <int> <chr> <chr> <chr> <int> <dbl> <dbl> <dbl>## 1 10194 P. aracou… abax… Perdiz… 2856 0.278 0.596 0.596## 2 10194 P. aracou… adax… Perdiz… 2856 0.254 0.567 0.567## 3 10194 P. aracou… abax… Perdiz… 2856 0.273 0.581 0.582## 4 10194 P. aracou… adax… Perdiz… 2856 0.258 0.576 0.577## 5 10194 P. aracou… abax… Perdiz… 2856 0.278 0.596 0.596## # … with 2 more variables: X4007.354 <dbl>, X4011.211 <dbl>
Os dados estão agrupados?
is_grouped_df(dados_agrupados)
## [1] TRUE
Suponhemos que eu queira ver médias de determinada variável para as espécies de meu conjunto de dados.
Usamos a função group_by
para agrupar os dados em torno da variável SP1
.
À primeira vista, não há resultado aparente.
Porém, ao usarmos essa função is_grouped_df()
, temos a certeza de que os dados estão agrupados.
Não se preocupem em aprender essa função.
Foquem na lição a seguir.
summarise(dados_agrupados, media_X8438.97 = mean(X8438.97))
## # A tibble: 2 × 2## SP1 media_X8438.97## <chr> <dbl>## 1 P. aracouchini 0.285## 2 P. calanense 0.369
Vamos sumarizar os dados para a variável X8438.97
.
dados_agrupados2 <- group_by( select(dados, SP1, ends_with("7")), SP1 )summarise_all(dados_agrupados2, .funs = mean)
## # A tibble: 2 × 172## SP1 X4003.497 X4053.637 X4103.777 X4153.917 X4204.057 X4238.77## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>## 1 P. aracouchi… 0.651 0.626 0.576 0.547 0.544 0.546## 2 P. calanense 0.736 0.709 0.653 0.622 0.620 0.625## # … with 165 more variables: X4254.197 <dbl>, X4292.767 <dbl>,## # X4304.337 <dbl>, X4342.907 <dbl>, X4393.047 <dbl>, X4443.187 <dbl>,## # X4489.47 <dbl>, X4493.327 <dbl>, X4543.467 <dbl>, X4582.037 <dbl>,## # X4593.607 <dbl>, X4632.177 <dbl>, X4682.317 <dbl>, X4732.457 <dbl>,## # X4782.597 <dbl>, X4821.167 <dbl>, X4832.737 <dbl>, X4871.307 <dbl>,## # X4882.877 <dbl>, X4921.447 <dbl>, X4971.587 <dbl>, X5017.87 <dbl>,## # X5021.727 <dbl>, X5071.867 <dbl>, X5110.437 <dbl>, X5122.007 <dbl>, …
ls()
.ls()
.%>%
(pacote magrittr)|>
(a partir do R 4.1).summarise_all(group_by(filter(select(dados, SP1, ends_with("7")), SP1 == "P. calanense"), SP1), .funs = mean)
## # A tibble: 1 × 172## SP1 X4003.497 X4053.637 X4103.777 X4153.917 X4204.057 X4238.77## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>## 1 P. calanense 0.736 0.709 0.653 0.622 0.620 0.625## # … with 165 more variables: X4254.197 <dbl>, X4292.767 <dbl>,## # X4304.337 <dbl>, X4342.907 <dbl>, X4393.047 <dbl>, X4443.187 <dbl>,## # X4489.47 <dbl>, X4493.327 <dbl>, X4543.467 <dbl>, X4582.037 <dbl>,## # X4593.607 <dbl>, X4632.177 <dbl>, X4682.317 <dbl>, X4732.457 <dbl>,## # X4782.597 <dbl>, X4821.167 <dbl>, X4832.737 <dbl>, X4871.307 <dbl>,## # X4882.877 <dbl>, X4921.447 <dbl>, X4971.587 <dbl>, X5017.87 <dbl>,## # X5021.727 <dbl>, X5071.867 <dbl>, X5110.437 <dbl>, X5122.007 <dbl>, …
dados_selecionados <- select(dados, SP1, ends_with("7"))dados_filtrados <- filter(dados_selecionados, SP1 == "P. calanense")dados_agrupados3 <- group_by(dados_filtrados, SP1)summarise_all(dados_agrupados3, .funs = mean)
## # A tibble: 1 × 172## SP1 X4003.497 X4053.637 X4103.777 X4153.917 X4204.057 X4238.77## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>## 1 P. calanense 0.736 0.709 0.653 0.622 0.620 0.625## # … with 165 more variables: X4254.197 <dbl>, X4292.767 <dbl>,## # X4304.337 <dbl>, X4342.907 <dbl>, X4393.047 <dbl>, X4443.187 <dbl>,## # X4489.47 <dbl>, X4493.327 <dbl>, X4543.467 <dbl>, X4582.037 <dbl>,## # X4593.607 <dbl>, X4632.177 <dbl>, X4682.317 <dbl>, X4732.457 <dbl>,## # X4782.597 <dbl>, X4821.167 <dbl>, X4832.737 <dbl>, X4871.307 <dbl>,## # X4882.877 <dbl>, X4921.447 <dbl>, X4971.587 <dbl>, X5017.87 <dbl>,## # X5021.727 <dbl>, X5071.867 <dbl>, X5110.437 <dbl>, X5122.007 <dbl>, …
Porém, a criação de objetos intermediários "suja" a área de trabalho com objetos que, muitas vezes, não chegarão a serem utilizados novamente
%>%
select(dados, SP1, ends_with("7")) %>% filter(., SP1 == "P. calanense") %>% group_by(., SP1) %>% summarise_all(., .funs = mean)
## # A tibble: 1 × 172## SP1 X4003.497 X4053.637 X4103.777 X4153.917 X4204.057 X4238.77## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>## 1 P. calanense 0.736 0.709 0.653 0.622 0.620 0.625## # … with 165 more variables: X4254.197 <dbl>, X4292.767 <dbl>,## # X4304.337 <dbl>, X4342.907 <dbl>, X4393.047 <dbl>, X4443.187 <dbl>,## # X4489.47 <dbl>, X4493.327 <dbl>, X4543.467 <dbl>, X4582.037 <dbl>,## # X4593.607 <dbl>, X4632.177 <dbl>, X4682.317 <dbl>, X4732.457 <dbl>,## # X4782.597 <dbl>, X4821.167 <dbl>, X4832.737 <dbl>, X4871.307 <dbl>,## # X4882.877 <dbl>, X4921.447 <dbl>, X4971.587 <dbl>, X5017.87 <dbl>,## # X5021.727 <dbl>, X5071.867 <dbl>, X5110.437 <dbl>, X5122.007 <dbl>, …
Suponha que você deseja obter valores de média de cada variável NIR por indivíduo.
Suponha que você deseja obter valores de média de cada variável NIR por indivíduo.
No conjunto de dados exemplo desta oficina, dados
, indivíduos são reconhecidos pela variável especimenid
.
Suponha que você deseja obter valores de média de cada variável NIR por indivíduo.
No conjunto de dados exemplo desta oficina, dados
, indivíduos são reconhecidos pela variável especimenid
.
Logo, esta variável, especimenid
, será nosso agrupamento.
%>%
)summarise_all( group_by(select(dados, especimenid, SP1, starts_with("X")), especimenid, SP1), .funs = mean)
## # A tibble: 6 × 1,559## # Groups: especimenid [6]## especimenid SP1 X10001.03 X3999.64 X4003.497 X4007.354 X4011.211## <int> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>## 1 10194 P. aracouc… 0.266 0.580 0.581 0.580 0.580## 2 10196 P. aracouc… 0.274 0.692 0.692 0.692 0.691## 3 10197 P. aracouc… 0.274 0.680 0.680 0.680 0.680## 4 12647 P. calanen… 0.328 0.723 0.723 0.723 0.723## 5 12648 P. calanen… 0.393 0.744 0.744 0.744 0.744## 6 12650 P. calanen… 0.347 0.741 0.741 0.741 0.741## # … with 1,552 more variables: X4015.068 <dbl>, X4018.925 <dbl>,## # X4022.781 <dbl>, X4026.638 <dbl>, X4030.495 <dbl>, X4034.352 <dbl>,## # X4038.209 <dbl>, X4042.066 <dbl>, X4045.923 <dbl>, X4049.78 <dbl>,## # X4053.637 <dbl>, X4057.494 <dbl>, X4061.351 <dbl>, X4065.208 <dbl>,## # X4069.065 <dbl>, X4072.922 <dbl>, X4076.779 <dbl>, X4080.635 <dbl>,## # X4084.492 <dbl>, X4088.349 <dbl>, X4092.206 <dbl>, X4096.063 <dbl>,## # X4099.92 <dbl>, X4103.777 <dbl>, X4107.634 <dbl>, X4111.491 <dbl>, …
%>%
Mesmo cálculo do slide anterior
dados %>% select(., especimenid, SP1, starts_with("X")) %>% group_by(., especimenid, SP1) %>% summarise_all(., .funs = mean)
## # A tibble: 6 × 1,559## # Groups: especimenid [6]## especimenid SP1 X10001.03 X3999.64 X4003.497 X4007.354 X4011.211## <int> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>## 1 10194 P. aracouc… 0.266 0.580 0.581 0.580 0.580## 2 10196 P. aracouc… 0.274 0.692 0.692 0.692 0.691## 3 10197 P. aracouc… 0.274 0.680 0.680 0.680 0.680## 4 12647 P. calanen… 0.328 0.723 0.723 0.723 0.723## 5 12648 P. calanen… 0.393 0.744 0.744 0.744 0.744## 6 12650 P. calanen… 0.347 0.741 0.741 0.741 0.741## # … with 1,552 more variables: X4015.068 <dbl>, X4018.925 <dbl>,## # X4022.781 <dbl>, X4026.638 <dbl>, X4030.495 <dbl>, X4034.352 <dbl>,## # X4038.209 <dbl>, X4042.066 <dbl>, X4045.923 <dbl>, X4049.78 <dbl>,## # X4053.637 <dbl>, X4057.494 <dbl>, X4061.351 <dbl>, X4065.208 <dbl>,## # X4069.065 <dbl>, X4072.922 <dbl>, X4076.779 <dbl>, X4080.635 <dbl>,## # X4084.492 <dbl>, X4088.349 <dbl>, X4092.206 <dbl>, X4096.063 <dbl>,## # X4099.92 <dbl>, X4103.777 <dbl>, X4107.634 <dbl>, X4111.491 <dbl>, …
%>%
)summarise_all( group_by(select(dados, especimenid, SP1, face, starts_with("X")), especimenid, SP1, face), .funs = mean)
## # A tibble: 12 × 1,560## # Groups: especimenid, SP1 [6]## especimenid SP1 face X10001.03 X3999.64 X4003.497 X4007.354## <int> <chr> <chr> <dbl> <dbl> <dbl> <dbl>## 1 10194 P. aracouchini abax… 0.275 0.589 0.589 0.589## 2 10194 P. aracouchini adax… 0.256 0.572 0.572 0.572## 3 10196 P. aracouchini abax… 0.275 0.692 0.692 0.692## 4 10196 P. aracouchini adax… 0.272 0.692 0.692 0.692## 5 10197 P. aracouchini abax… 0.273 0.675 0.675 0.675## 6 10197 P. aracouchini adax… 0.274 0.686 0.686 0.685## 7 12647 P. calanense abax… 0.331 0.720 0.721 0.720## 8 12647 P. calanense adax… 0.324 0.725 0.725 0.725## 9 12648 P. calanense abax… 0.410 0.747 0.747 0.747## 10 12648 P. calanense adax… 0.376 0.741 0.741 0.741## 11 12650 P. calanense abax… 0.346 0.723 0.723 0.724## 12 12650 P. calanense adax… 0.349 0.758 0.759 0.759## # … with 1,553 more variables: X4011.211 <dbl>, X4015.068 <dbl>,## # X4018.925 <dbl>, X4022.781 <dbl>, X4026.638 <dbl>, X4030.495 <dbl>,## # X4034.352 <dbl>, X4038.209 <dbl>, X4042.066 <dbl>, X4045.923 <dbl>,## # X4049.78 <dbl>, X4053.637 <dbl>, X4057.494 <dbl>, X4061.351 <dbl>,## # X4065.208 <dbl>, X4069.065 <dbl>, X4072.922 <dbl>, X4076.779 <dbl>,## # X4080.635 <dbl>, X4084.492 <dbl>, X4088.349 <dbl>, X4092.206 <dbl>,## # X4096.063 <dbl>, X4099.92 <dbl>, X4103.777 <dbl>, X4107.634 <dbl>, …
%>%
Mesmo cálculo do slide anterior
dados %>% select(., especimenid, SP1, face, starts_with("X")) %>% group_by(., especimenid, SP1, face) %>% summarise_all(., .funs = mean)
## # A tibble: 12 × 1,560## # Groups: especimenid, SP1 [6]## especimenid SP1 face X10001.03 X3999.64 X4003.497 X4007.354## <int> <chr> <chr> <dbl> <dbl> <dbl> <dbl>## 1 10194 P. aracouchini abax… 0.275 0.589 0.589 0.589## 2 10194 P. aracouchini adax… 0.256 0.572 0.572 0.572## 3 10196 P. aracouchini abax… 0.275 0.692 0.692 0.692## 4 10196 P. aracouchini adax… 0.272 0.692 0.692 0.692## 5 10197 P. aracouchini abax… 0.273 0.675 0.675 0.675## 6 10197 P. aracouchini adax… 0.274 0.686 0.686 0.685## 7 12647 P. calanense abax… 0.331 0.720 0.721 0.720## 8 12647 P. calanense adax… 0.324 0.725 0.725 0.725## 9 12648 P. calanense abax… 0.410 0.747 0.747 0.747## 10 12648 P. calanense adax… 0.376 0.741 0.741 0.741## 11 12650 P. calanense abax… 0.346 0.723 0.723 0.724## 12 12650 P. calanense adax… 0.349 0.758 0.759 0.759## # … with 1,553 more variables: X4011.211 <dbl>, X4015.068 <dbl>,## # X4018.925 <dbl>, X4022.781 <dbl>, X4026.638 <dbl>, X4030.495 <dbl>,## # X4034.352 <dbl>, X4038.209 <dbl>, X4042.066 <dbl>, X4045.923 <dbl>,## # X4049.78 <dbl>, X4053.637 <dbl>, X4057.494 <dbl>, X4061.351 <dbl>,## # X4065.208 <dbl>, X4069.065 <dbl>, X4072.922 <dbl>, X4076.779 <dbl>,## # X4080.635 <dbl>, X4084.492 <dbl>, X4088.349 <dbl>, X4092.206 <dbl>,## # X4096.063 <dbl>, X4099.92 <dbl>, X4103.777 <dbl>, X4107.634 <dbl>, …
treino
e teste
Vamos utilizar aqui as funcionalidades dos pacotes dentro da interface tidymodels
(Kuhn et al. 2020).
rsample::initial_split()
(Silge et al. 2021)library("rsample") # initial_split
dados_split <- initial_split(dados, prop = 3/4)dados_split
## <Analysis/Assess/Total>## <36/12/48>
rsample::initial_split(), que é carregado automaticamente ao se chamar o pacote tidymodels
- esta função cria índices para separar o conjunto de dados em treino
e teste
. Por padrão, a função divide o conjunto de dados em 75% para treino
e 25% para teste
. Caso você queira outra proporção, altere o argumento prop
. Em caso de dúvida, veja o ?
desta função executando o comando ?initial_split
.
dados_split <- initial_split(dados, prop = 3/4, strata = "SP1")
rsample::training()
vs. teste rsample::testing()
rsample::training()
vs. teste rsample::testing()
treino <- training(dados_split)table(treino$SP1)
## ## P. aracouchini P. calanense ## 18 18
ambas do mesmo pacote rsample
- ambas recebem o objeto criado com a função initial_split()
, dados_split
, e dividem o treino em conjuntos treino
e teste
, respectivamente:
rsample::training()
vs. teste rsample::testing()
teste <- testing(dados_split)table(teste$SP1)
## ## P. aracouchini P. calanense ## 6 6
set.seed()
set.seed(221015)iris_split <- initial_split(iris, prop = 3/4, strata = "Species")iris_split
## <Analysis/Assess/Total>## <111/39/150>
Vamos estabelecer uma seed
para que vocês cheguem ao mesmo resultado, caso utilizem estas "receitas" durante o aprendizado do tutorial.
Recomendo que vocês executem esses comandos juntamente comigo para que vocês tenham ciência de que a quebra dos dados será igual para todos.
head(training(iris_split), 20)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species## 1 5.1 3.5 1.4 0.2 setosa## 2 4.9 3.0 1.4 0.2 setosa## 3 4.7 3.2 1.3 0.2 setosa## 5 5.0 3.6 1.4 0.2 setosa## 8 5.0 3.4 1.5 0.2 setosa## 9 4.4 2.9 1.4 0.2 setosa## 10 4.9 3.1 1.5 0.1 setosa## 12 4.8 3.4 1.6 0.2 setosa## 13 4.8 3.0 1.4 0.1 setosa## 14 4.3 3.0 1.1 0.1 setosa## 15 5.8 4.0 1.2 0.2 setosa## 16 5.7 4.4 1.5 0.4 setosa## 18 5.1 3.5 1.4 0.3 setosa## 19 5.7 3.8 1.7 0.3 setosa## 20 5.1 3.8 1.5 0.3 setosa## 23 4.6 3.6 1.0 0.2 setosa## 25 4.8 3.4 1.9 0.2 setosa## 26 5.0 3.0 1.6 0.2 setosa## 27 5.0 3.4 1.6 0.4 setosa## 28 5.2 3.5 1.5 0.2 setosa
recipes
(Kuhn e Wickham 2021).recipes
(Kuhn e Wickham 2021).recipes
(Kuhn e Wickham 2021).Seleção de variáveis
Remoção de valores ausentes
recipes
(Kuhn e Wickham 2021).Seleção de variáveis
Remoção de valores ausentes
Transformar valores
recipes
(Kuhn e Wickham 2021).Seleção de variáveis
Remoção de valores ausentes
Transformar valores
etc (ver https://www.tmwr.org/recipes.html#skip-equals-true)
recipes::recipe(FORMULA, data = NomeDoDataFrame)
Ele facilita a criação de "receitas" que permitem a criação e documentação de conjuntos de dados para serem utilizados posteriormente em análises do tidymodels
, permitindo ao usuário um fluxo contínuo de análise de dados e a facilidade na reutilização do mesmo conjunto de dados para diversas análises.
Recomendo o aprendizado destas novas (algumas não tão novas, como é o caso do pacote caret
ferramentas de pré-processamento e análise de dados em R.
A primeira função desta abordagem é a função recipe()
, em que usamos uma fórmula SP1 ~ .
para dizer que SP1
é nossa variável resposta e as demais são as variáveis preditoras, representadas pelo .
na fórmula.
Porém, sabemos que nosso conjunto de dados dados
possui outras variáveis que não são preditoras, como face
e coletor
.
library("recipes")
recipes::recipe(SP1 ~ ., data = dados)
## Recipe## ## Inputs:## ## role #variables## outcome 1## predictor 1561
Aí entra o papel da função update_role()
em que informamos o papel de cada variável extra em nosso conjunto de dados.
Por exemplo, as variáveis coletor
e number
são identificadores da coleta.
Então, iniciamos a função com o objeto contendo a receita, dados_receita
, e colocamos estas duas variáveis, sem aspas, em seguida, seguido do argumento new_role
, em que colocamos um texto informando que papel é esse.
Ao utilizarmos esta receita nos passos de análises, essas variáveis não serão analisadas pois terão a informação desses papéis
que elas têm no conjunto de dados.
recipes::recipe(SP1 ~ ., data = dados) %>% update_role(., coletor, number, new_role = "dados do espécime")
## Recipe## ## Inputs:## ## role #variables## dados do espécime 2## outcome 1## predictor 1559
recipes::recipe(SP1 ~ ., data = dados) %>% update_role(., coletor, number, new_role = "dados do espécime") %>% update_role(., face, new_role = "identificador da face do foliolo")
## Recipe## ## Inputs:## ## role #variables## dados do espécime 2## identificador da face do foliolo 1## outcome 1## predictor 1558
recipes::recipe(SP1 ~ ., data = treino) %>% update_role(., coletor, number, new_role = "dados do espécime") %>% update_role(., face, new_role = "identificador da face do foliolo") %>% update_role(., especimenid, new_role = "id")
## Recipe## ## Inputs:## ## role #variables## dados do espécime 2## id 1## identificador da face do foliolo 1## outcome 1## predictor 1557
dados_receita <- recipes::recipe(SP1 ~ ., data = treino) %>% update_role(., especimenid, new_role = "id") %>% update_role(., coletor, number, new_role = "dados do espécime") %>% update_role(., face, new_role = "identificador da face do foliolo")dados_receita
## Recipe## ## Inputs:## ## role #variables## dados do espécime 2## id 1## identificador da face do foliolo 1## outcome 1## predictor 1557
prep()
dados_receita_prep <- prep(dados_receita)dados_receita_prep
## Recipe## ## Inputs:## ## role #variables## dados do espécime 2## id 1## identificador da face do foliolo 1## outcome 1## predictor 1557## ## Training data contained 36 data points and no missing data.
teste
pós-receita
bake()
teste_processado <- bake(dados_receita_prep, new_data = teste)teste_processado
## # A tibble: 12 × 1,562## especimenid face coletor number X10001.03 X3999.64 X4003.497 X4007.354## <int> <fct> <fct> <int> <dbl> <dbl> <dbl> <dbl>## 1 10194 adax… Perdiz… 2856 0.258 0.576 0.577 0.577## 2 10194 abax… Perdiz… 2856 0.278 0.596 0.596 0.596## 3 10194 abax… Perdiz… 2856 0.273 0.581 0.582 0.582## 4 10196 abax… Perdiz… 2858 0.276 0.703 0.703 0.703## 5 10196 adax… Perdiz… 2858 0.267 0.712 0.712 0.711## 6 10197 abax… Perdiz… 2859 0.276 0.668 0.668 0.668## 7 12647 adax… Perdiz… 3236 0.320 0.735 0.736 0.736## 8 12647 adax… Perdiz… 3236 0.320 0.735 0.736 0.736## 9 12648 adax… Perdiz… 3237 0.389 0.757 0.757 0.757## 10 12650 abax… Perdiz… 3239 0.349 0.733 0.733 0.733## 11 12650 adax… Perdiz… 3239 0.342 0.744 0.744 0.744## 12 12650 adax… Perdiz… 3239 0.355 0.773 0.773 0.773## # … with 1,554 more variables: X4011.211 <dbl>, X4015.068 <dbl>,## # X4018.925 <dbl>, X4022.781 <dbl>, X4026.638 <dbl>, X4030.495 <dbl>,## # X4034.352 <dbl>, X4038.209 <dbl>, X4042.066 <dbl>, X4045.923 <dbl>,## # X4049.78 <dbl>, X4053.637 <dbl>, X4057.494 <dbl>, X4061.351 <dbl>,## # X4065.208 <dbl>, X4069.065 <dbl>, X4072.922 <dbl>, X4076.779 <dbl>,## # X4080.635 <dbl>, X4084.492 <dbl>, X4088.349 <dbl>, X4092.206 <dbl>,## # X4096.063 <dbl>, X4099.92 <dbl>, X4103.777 <dbl>, X4107.634 <dbl>, …
treino
juice()
juice(dados_receita_prep)
## # A tibble: 36 × 1,562## especimenid face coletor number X10001.03 X3999.64 X4003.497 X4007.354## <int> <fct> <fct> <int> <dbl> <dbl> <dbl> <dbl>## 1 10194 abax… Perdiz… 2856 0.278 0.596 0.596 0.596## 2 10194 adax… Perdiz… 2856 0.254 0.567 0.567 0.567## 3 10194 abax… Perdiz… 2856 0.273 0.581 0.582 0.582## 4 10194 adax… Perdiz… 2856 0.254 0.567 0.567 0.567## 5 10194 adax… Perdiz… 2856 0.258 0.576 0.577 0.577## 6 10196 abax… Perdiz… 2858 0.274 0.681 0.681 0.681## 7 10196 adax… Perdiz… 2858 0.278 0.673 0.672 0.672## 8 10196 adax… Perdiz… 2858 0.267 0.712 0.712 0.711## 9 10196 abax… Perdiz… 2858 0.274 0.681 0.681 0.681## 10 10196 adax… Perdiz… 2858 0.278 0.673 0.672 0.672## # … with 26 more rows, and 1,554 more variables: X4011.211 <dbl>,## # X4015.068 <dbl>, X4018.925 <dbl>, X4022.781 <dbl>, X4026.638 <dbl>,## # X4030.495 <dbl>, X4034.352 <dbl>, X4038.209 <dbl>, X4042.066 <dbl>,## # X4045.923 <dbl>, X4049.78 <dbl>, X4053.637 <dbl>, X4057.494 <dbl>,## # X4061.351 <dbl>, X4065.208 <dbl>, X4069.065 <dbl>, X4072.922 <dbl>,## # X4076.779 <dbl>, X4080.635 <dbl>, X4084.492 <dbl>, X4088.349 <dbl>,## # X4092.206 <dbl>, X4096.063 <dbl>, X4099.92 <dbl>, X4103.777 <dbl>, …
# receita para analisedados_receita <- recipes::recipe(SP1 ~ ., data = treino)dados_receita <- update_role(dados_receita, especimenid, new_role = "id")dados_receita <- update_role(dados_receita, coletor, number, new_role = "dados do espécime")dados_receita <- update_role(dados_receita, face, new_role = "identificador da face do foliolo")dados_receita_prep <- prep(dados_receita)dados_receita_prep
# receita para analisedados_receita <- recipes::recipe(SP1 ~ ., data = treino)dados_receita <- update_role(dados_receita, especimenid, new_role = "id")dados_receita <- update_role(dados_receita, coletor, number, new_role = "dados do espécime")dados_receita <- update_role(dados_receita, face, new_role = "identificador da face do foliolo")dados_receita_prep <- prep(dados_receita)dados_receita_prep
%>%
Vejam que os comandos acima ficaram muito repetitivos, pois a receita dados_receita
aparece múltiplas vezes.
Caso utilizássemos o encadeamento de ações proporcionado pelo operador %>%
do pacote magrittr
(Bache e Wickham 2020), o texto ficaria mais limpo.
Porém, devo admitir que isto é uma questão de preferência.
dados_receita_normal <- dados_receita %>% step_normalize(all_predictors())dados_receita_normal
## Recipe## ## Inputs:## ## role #variables## dados do espécime 2## id 1## identificador da face do foliolo 1## outcome 1## predictor 1557## ## Operations:## ## Centering and scaling for all_predictors()
step_*()
step_*()
PCA é um algoritmo matemático que reduz as dimensões dos dados ao mesmo tempo em que mantem a maior parte da variação do conjunto de dados. Ele cumpre essa redução ao identificar direções, chamadas de componentes principais, ao longo das quais a variação dos dados é máxima. Ao utilizar menos componentes, cada amostra pode ser representada por poucas variáveis em oposição à enormidade de variáveis presentes no conjunto de dados brutos. Amostras podem então ser plotadas, permitindo a inferência visual de similaridades e diferenças entre as amostras, e também determinar se as amostras podem ou não ser agrupadas1.
dados_receita_pca <- dados_receita %>% step_pca(all_predictors())dados_receita_pca
## Recipe## ## Inputs:## ## role #variables## dados do espécime 2## id 1## identificador da face do foliolo 1## outcome 1## predictor 1557## ## Operations:## ## No PCA components were extracted.
dados_receita_pca_prep <- dados_receita_pca %>% prep()dados_receita_pca_prep
## Recipe## ## Inputs:## ## role #variables## dados do espécime 2## id 1## identificador da face do foliolo 1## outcome 1## predictor 1557## ## Training data contained 36 data points and no missing data.## ## Operations:## ## PCA extraction with X10001.03, X3999.64, X4003.497, X4007.354,... [trained]
tidy()
pca_tabela <- tidy(dados_receita_pca_prep, 1)pca_tabela
## # A tibble: 56,052 × 4## terms value component id ## <chr> <dbl> <chr> <chr> ## 1 X10001.03 -0.0202 PC1 pca_OTwyZ## 2 X3999.64 -0.0439 PC1 pca_OTwyZ## 3 X4003.497 -0.0440 PC1 pca_OTwyZ## 4 X4007.354 -0.0439 PC1 pca_OTwyZ## 5 X4011.211 -0.0439 PC1 pca_OTwyZ## 6 X4015.068 -0.0439 PC1 pca_OTwyZ## 7 X4018.925 -0.0438 PC1 pca_OTwyZ## 8 X4022.781 -0.0437 PC1 pca_OTwyZ## 9 X4026.638 -0.0436 PC1 pca_OTwyZ## 10 X4030.495 -0.0435 PC1 pca_OTwyZ## # … with 56,042 more rows
## pcs variacao_porcentagem variacao_cumulativa## 1 PC1 9.983774e+01 99.83774## 2 PC2 1.588772e-01 99.99662## 3 PC3 1.852337e-03 99.99847## 4 PC4 7.829202e-04 99.99926## 5 PC5 4.341331e-04 99.99969## 6 PC6 1.443706e-04 99.99984## 7 PC7 1.197724e-04 99.99995## 8 PC8 1.804392e-05 99.99997## 9 PC9 1.109191e-05 99.99998## 10 PC10 5.475665e-06 99.99999## 11 PC11 2.229137e-06 99.99999## 12 PC12 2.093980e-06 99.99999## 13 PC13 1.370498e-06 100.00000## 14 PC14 1.233161e-06 100.00000## 15 PC15 8.109688e-07 100.00000## 16 PC16 5.629829e-07 100.00000## 17 PC17 5.169118e-07 100.00000## 18 PC18 3.935604e-07 100.00000## 19 PC19 3.134876e-07 100.00000## 20 PC20 2.822530e-07 100.00000## 21 PC21 2.382419e-07 100.00000## 22 PC22 1.924840e-07 100.00000## 23 PC23 1.692351e-07 100.00000## 24 PC24 9.965630e-31 100.00000## 25 PC25 9.965630e-31 100.00000## 26 PC26 9.965630e-31 100.00000## 27 PC27 9.965630e-31 100.00000## 28 PC28 9.965630e-31 100.00000## 29 PC29 9.965630e-31 100.00000## 30 PC30 9.965630e-31 100.00000## 31 PC31 9.965630e-31 100.00000## 32 PC32 9.965630e-31 100.00000## 33 PC33 9.965630e-31 100.00000## 34 PC34 9.965630e-31 100.00000## 35 PC35 9.965630e-31 100.00000## 36 PC36 9.965630e-31 100.00000
sdev <- dados_receita_pca_prep$steps[[1]]$res$sdevpercent_variation <- sdev^2 / sum(sdev^2)pca_variacao <- data.frame( pcs = unique(pca_tabela$component), variacao_porcentagem = percent_variation*100, variacao_cumulativa = cumsum(percent_variation*100) )pca_variacao
ggplot2
pc1 <- filter(pca_variacao, pcs == "PC1")pc2 <- filter(pca_variacao, pcs == "PC2")juice(dados_receita_pca_prep) %>% ggplot(aes(PC1, PC2)) + geom_point(aes(color = SP1), alpha = 0.7, size = 2) + xlab(paste0("PC1 (", round(pc1$variacao_porcentagem, 2), "%)")) + ylab(paste0("PC2 (", round(pc2$variacao_porcentagem, 2), "%)"))
dados_receita_normal_pca <- dados_receita_normal %>% step_pca(all_predictors()) %>% prep()dados_receita_normal_pca
## Recipe## ## Inputs:## ## role #variables## dados do espécime 2## id 1## identificador da face do foliolo 1## outcome 1## predictor 1557## ## Training data contained 36 data points and no missing data.## ## Operations:## ## Centering and scaling for X10001.03, X3999.64, X4003.497, X4007.354... [trained]## PCA extraction with X10001.03, X3999.64, X4003.497, X4007.354,... [trained]
tidy(dados_receita_normal_pca, 1)
## # A tibble: 3,114 × 4## terms statistic value id ## <chr> <chr> <dbl> <chr> ## 1 X10001.03 mean 0.315 normalize_0VXeM## 2 X3999.64 mean 0.693 normalize_0VXeM## 3 X4003.497 mean 0.694 normalize_0VXeM## 4 X4007.354 mean 0.694 normalize_0VXeM## 5 X4011.211 mean 0.693 normalize_0VXeM## 6 X4015.068 mean 0.693 normalize_0VXeM## 7 X4018.925 mean 0.692 normalize_0VXeM## 8 X4022.781 mean 0.690 normalize_0VXeM## 9 X4026.638 mean 0.688 normalize_0VXeM## 10 X4030.495 mean 0.686 normalize_0VXeM## # … with 3,104 more rows
tidy(dados_receita_normal_pca, 1) %>% filter(statistic == "mean")
## # A tibble: 1,557 × 4## terms statistic value id ## <chr> <chr> <dbl> <chr> ## 1 X10001.03 mean 0.315 normalize_0VXeM## 2 X3999.64 mean 0.693 normalize_0VXeM## 3 X4003.497 mean 0.694 normalize_0VXeM## 4 X4007.354 mean 0.694 normalize_0VXeM## 5 X4011.211 mean 0.693 normalize_0VXeM## 6 X4015.068 mean 0.693 normalize_0VXeM## 7 X4018.925 mean 0.692 normalize_0VXeM## 8 X4022.781 mean 0.690 normalize_0VXeM## 9 X4026.638 mean 0.688 normalize_0VXeM## 10 X4030.495 mean 0.686 normalize_0VXeM## # … with 1,547 more rows
tidy(dados_receita_normal_pca, 1) %>% filter(statistic == "sd")
## # A tibble: 1,557 × 4## terms statistic value id ## <chr> <chr> <dbl> <chr> ## 1 X10001.03 sd 0.0504 normalize_0VXeM## 2 X3999.64 sd 0.0548 normalize_0VXeM## 3 X4003.497 sd 0.0548 normalize_0VXeM## 4 X4007.354 sd 0.0549 normalize_0VXeM## 5 X4011.211 sd 0.0549 normalize_0VXeM## 6 X4015.068 sd 0.0549 normalize_0VXeM## 7 X4018.925 sd 0.0549 normalize_0VXeM## 8 X4022.781 sd 0.0548 normalize_0VXeM## 9 X4026.638 sd 0.0547 normalize_0VXeM## 10 X4030.495 sd 0.0546 normalize_0VXeM## # … with 1,547 more rows
pca_tabela_normalizada <- tidy(dados_receita_normal_pca, 2)pca_tabela_normalizada
## # A tibble: 56,052 × 4## terms value component id ## <chr> <dbl> <chr> <chr> ## 1 X10001.03 0.0257 PC1 pca_lZPx9## 2 X3999.64 0.0216 PC1 pca_lZPx9## 3 X4003.497 0.0216 PC1 pca_lZPx9## 4 X4007.354 0.0217 PC1 pca_lZPx9## 5 X4011.211 0.0217 PC1 pca_lZPx9## 6 X4015.068 0.0218 PC1 pca_lZPx9## 7 X4018.925 0.0218 PC1 pca_lZPx9## 8 X4022.781 0.0218 PC1 pca_lZPx9## 9 X4026.638 0.0218 PC1 pca_lZPx9## 10 X4030.495 0.0219 PC1 pca_lZPx9## # … with 56,042 more rows
## pcs variacao_porcentagem variacao_cumulativa## 1 PC1 9.500236e+01 95.00236## 2 PC2 4.772334e+00 99.77469## 3 PC3 1.379815e-01 99.91267## 4 PC4 5.057695e-02 99.96325## 5 PC5 1.919332e-02 99.98244## 6 PC6 1.076041e-02 99.99320## 7 PC7 4.050682e-03 99.99725## 8 PC8 1.002161e-03 99.99825## 9 PC9 6.999285e-04 99.99895## 10 PC10 3.833044e-04 99.99934## 11 PC11 1.616011e-04 99.99950## 12 PC12 1.414900e-04 99.99964## 13 PC13 1.004364e-04 99.99974## 14 PC14 6.324811e-05 99.99980## 15 PC15 4.144309e-05 99.99985## 16 PC16 3.638183e-05 99.99988## 17 PC17 2.951095e-05 99.99991## 18 PC18 2.492981e-05 99.99994## 19 PC19 2.111392e-05 99.99996## 20 PC20 1.744787e-05 99.99998## 21 PC21 1.303788e-05 99.99999## 22 PC22 1.136185e-05 100.00000## 23 PC23 1.703797e-29 100.00000## 24 PC24 8.279586e-31 100.00000## 25 PC25 8.279586e-31 100.00000## 26 PC26 8.279586e-31 100.00000## 27 PC27 8.279586e-31 100.00000## 28 PC28 8.279586e-31 100.00000## 29 PC29 8.279586e-31 100.00000## 30 PC30 8.279586e-31 100.00000## 31 PC31 8.279586e-31 100.00000## 32 PC32 8.279586e-31 100.00000## 33 PC33 8.279586e-31 100.00000## 34 PC34 8.279586e-31 100.00000## 35 PC35 8.279586e-31 100.00000## 36 PC36 8.279586e-31 100.00000
sdev_pca_normalizada <- dados_receita_normal_pca$steps[[2]]$res$sdevporcent_variacao_normalizada <- sdev_pca_normalizada^2 / sum(sdev_pca_normalizada^2)pca_normalizada_variacao <- data.frame( pcs = unique(pca_tabela_normalizada$component), variacao_porcentagem = porcent_variacao_normalizada*100, variacao_cumulativa = cumsum(porcent_variacao_normalizada*100) )pca_normalizada_variacao
pc1_normal <- filter(pca_normalizada_variacao, pcs == "PC1")pc2_normal <- filter(pca_normalizada_variacao, pcs == "PC2")juice(dados_receita_normal_pca) %>% ggplot(aes(PC1, PC2)) + geom_point(aes(color = SP1), alpha = 0.7, size = 2) + xlab(paste0("PC1 (", round(pc1_normal$variacao_porcentagem, 2), "%)")) + ylab(paste0("PC2 (", round(pc2_normal$variacao_porcentagem, 2), "%)"))
Kuhn, M. e Johnson, K. 2019. Feature Engineering and Selection: A Practical Approach for Predictive Models. CRC Press.
Kuhn, M. 2019. The caret package. Disponível em https://topepo.github.io/caret/index.html.
Kuhn, M. 2019. A Short Introduction to the caret Package. Disponível em https://cran.r-project.org/web/packages/caret/vignettes/caret.html.
Kuhn, Max e Silge, J. 2021. Tidy Modeling with R. Disponível em https://www.tmwr.org/base-r.html.
Perdiz, R. O que é o tidyverse? Disponível em https://www.ricardoperdiz.com/blog/2020-04-tidyverse/
Silge, Julia. Todas suas postagens são úteis. #tidytuesday #tidymodels.
Wickham, H. e Grolemund, J. 2017. R for Data Science. Disponível em https://r4ds.had.co.nz.
Dr. em Botânica (INPA)
Analista de dados
@ricoperdiz
@ricoperdiz
ricardoperdiz.com
ricoperdiz@gmail.com
Keyboard shortcuts
↑, ←, Pg Up, k | Go to previous slide |
↓, →, Pg Dn, Space, j | Go to next slide |
Home | Go to first slide |
End | Go to last slide |
Number + Return | Go to specific slide |
b / m / f | Toggle blackout / mirrored / fullscreen mode |
c | Clone slideshow |
p | Toggle presenter mode |
t | Restart the presentation timer |
?, h | Toggle this help |
o | Tile View: Overview of Slides |
s | Toggle scribble toolbox |
Alt + f | Fit Slides to Screen |
Esc | Back to slideshow |
Dr. em Botânica (INPA)
Analista de dados
@ricoperdiz
@ricoperdiz
ricardoperdiz.com
ricoperdiz@gmail.com
plot(mtcars$hp, mtcars$mpg)plot(mpg ~ hp, data = mtcars)library(lattice)xyplot(mpg ~ hp, data = mtcars)library(ggplot2)ggplot(mtcars, aes(x = hp, y = mpg)) + geom_point()
Várias maneiras de se fazer algo em R, todas com vantagens e desvantagens. O guia de desenvolvedor do Python afirma: R é muito diferente de Python nesse aspecto. Uma vantagem da diversidade de interfaces do R é que ela pode se desenvolver com o tempo e se ajustar às diferentes necessidades dos usuários.
data.frame(a = 1:10, b = 1:10)
data.frame( a = 1:10, b = 1:10)
nir_data
1, que acompanha o pacote NIRtools
2.nir_data
1, que acompanha o pacote NIRtools
2.Perdiz (2020) Delimitação específica e filogeografia do complexo Protium aracouchini (Aubl.) Marchand (Burseraceae). Tese de doutorado. Programa de pós-graduação em Ciências Biológicas, INPA, Manaus, Amazonas, Brasil. https://repositorio.inpa.gov.br/handle/1/36948
Perdiz (2021) https://github.com/ricoperdiz/NIRtools
Vou utilizar o conjunto de dados nir_data
, um subconjunto proveniente de minha tese de doutorado (Perdiz 2020), e que acompanha o pacote NIRtools
(Perdiz 2021) para servir como exemplo para as análises neste tutorial.
Vale ressaltar que esse conjunto de dados é extremamente pequeno, por isso desconsidere os resultados das análises.
Ele servirá apenas de guia para abordar os procedimentos aqui abordados.
nir_data
1Para ler o conjunto de dados que utilizarei nesta oficina, basta rodar o comando abaixo:
dados <- read.table("https://raw.githubusercontent.com/ricoperdiz/NIRtools/master/inst/extdata/nir_data.csv", sep = "\t", header = TRUE, as.is = TRUE)
nir_data
1Para ler o conjunto de dados que utilizarei nesta oficina, basta rodar o comando abaixo:
dados <- read.table("https://raw.githubusercontent.com/ricoperdiz/NIRtools/master/inst/extdata/nir_data.csv", sep = "\t", header = TRUE, as.is = TRUE)
De maneira alternativa, você pode ler estes dados utilizando a função fread()
do pacote data.table
:
library("data.table")dados <- fread("https://raw.githubusercontent.com/ricoperdiz/NIRtools/master/inst/extdata/nir_data.csv")
De maneira alternativa, como no exemplo anterior, você pode utilizar a função fread()
do pacote data.table
. Esta função não exige a especificação do separador, pois é automaticamente descoberto:
library("data.table")dados <- fread("MEUSDADOS.csv")
data.frame
em um tibble
1library("tibble")dados <- as_tibble(dados)head(dados)
## # A tibble: 6 × 1,562## especimenid SP1 face coletor number X10001.03 X3999.64 X4003.497## <int> <chr> <chr> <chr> <int> <dbl> <dbl> <dbl>## 1 10194 P. aracou… abax… Perdiz… 2856 0.278 0.596 0.596## 2 10194 P. aracou… adax… Perdiz… 2856 0.254 0.567 0.567## 3 10194 P. aracou… abax… Perdiz… 2856 0.273 0.581 0.582## 4 10194 P. aracou… adax… Perdiz… 2856 0.258 0.576 0.577## 5 10194 P. aracou… abax… Perdiz… 2856 0.278 0.596 0.596## 6 10194 P. aracou… adax… Perdiz… 2856 0.254 0.567 0.567## # … with 1,554 more variables: X4007.354 <dbl>, X4011.211 <dbl>,## # X4015.068 <dbl>, X4018.925 <dbl>, X4022.781 <dbl>, X4026.638 <dbl>,## # X4030.495 <dbl>, X4034.352 <dbl>, X4038.209 <dbl>, X4042.066 <dbl>,## # X4045.923 <dbl>, X4049.78 <dbl>, X4053.637 <dbl>, X4057.494 <dbl>,## # X4061.351 <dbl>, X4065.208 <dbl>, X4069.065 <dbl>, X4072.922 <dbl>,## # X4076.779 <dbl>, X4080.635 <dbl>, X4084.492 <dbl>, X4088.349 <dbl>,## # X4092.206 <dbl>, X4096.063 <dbl>, X4099.92 <dbl>, X4103.777 <dbl>, …
tibble
em https://r4ds.had.co.nz/tibbles.html. Primeiras 10 linhas e 5 colunas
dados[1:10, 1:5]
## # A tibble: 10 × 5## especimenid SP1 face coletor number## <int> <chr> <chr> <chr> <int>## 1 10194 P. aracouchini abaxial Perdiz, R.O. 2856## 2 10194 P. aracouchini adaxial Perdiz, R.O. 2856## 3 10194 P. aracouchini abaxial Perdiz, R.O. 2856## 4 10194 P. aracouchini adaxial Perdiz, R.O. 2856## 5 10194 P. aracouchini abaxial Perdiz, R.O. 2856## 6 10194 P. aracouchini adaxial Perdiz, R.O. 2856## 7 10194 P. aracouchini abaxial Perdiz, R.O. 2856## 8 10194 P. aracouchini adaxial Perdiz, R.O. 2856## 9 10196 P. aracouchini abaxial Perdiz, R.O. 2858## 10 10196 P. aracouchini adaxial Perdiz, R.O. 2858
str(dados[, 1:15])
## tibble [48 × 15] (S3: tbl_df/tbl/data.frame)## $ especimenid: int [1:48] 10194 10194 10194 10194 10194 10194 10194 10194 10196 10196 ...## $ SP1 : chr [1:48] "P. aracouchini" "P. aracouchini" "P. aracouchini" "P. aracouchini" ...## $ face : chr [1:48] "abaxial" "adaxial" "abaxial" "adaxial" ...## $ coletor : chr [1:48] "Perdiz, R.O." "Perdiz, R.O." "Perdiz, R.O." "Perdiz, R.O." ...## $ number : int [1:48] 2856 2856 2856 2856 2856 2856 2856 2856 2858 2858 ...## $ X10001.03 : num [1:48] 0.278 0.254 0.273 0.258 0.278 ...## $ X3999.64 : num [1:48] 0.596 0.567 0.581 0.576 0.596 ...## $ X4003.497 : num [1:48] 0.596 0.567 0.582 0.577 0.596 ...## $ X4007.354 : num [1:48] 0.596 0.567 0.582 0.577 0.596 ...## $ X4011.211 : num [1:48] 0.596 0.567 0.582 0.577 0.596 ...## $ X4015.068 : num [1:48] 0.596 0.567 0.581 0.576 0.596 ...## $ X4018.925 : num [1:48] 0.595 0.566 0.58 0.575 0.595 ...## $ X4022.781 : num [1:48] 0.593 0.565 0.579 0.574 0.593 ...## $ X4026.638 : num [1:48] 0.592 0.563 0.578 0.573 0.592 ...## $ X4030.495 : num [1:48] 0.59 0.562 0.576 0.571 0.59 ...## - attr(*, ".internal.selfref")=<externalptr>
SP1
é a variável que contem nome de espécie em meu conjunto de dados:
table(dados$SP1)
## ## P. aracouchini P. calanense ## 24 24
NIRtools
1Função nirdf()
2,3 converte um objeto com dados NIR em um objeto de classe nirdf
, o que permite então utilizar u método próprio para plotar em R usando a função plot()
.
nirdad <- NIRtools::nirdf( dados, category = "SP1", measure_columns = grep("^X", names(dados), value = TRUE), measure_columns_prefix = "X" )
plot(nirdad, "SP1", cex_pt = .7, cex_leg = 2, text_font = 3)
Ver tutorial em https://github.com/ricoperdiz/NIRtools para aprender a usar a função nirdad
.
Outra alternativa é utilizar os passos contidos em http://botanicaamazonica.wiki.br/labotam/doku.php?id=analises:nir:ver_spectra, de autoria do Dr. Alberto Vicentini (INPA).
Este pacote possui uma série de funções/verbos para manipular e sumarizar dados tabulados.
Não é o pacote mais rápido ou eficiente para fazer tais ações.
Porém, o uso de funções cujos nomes nos remetem às ações que efetuamos rotineiramente com dados facilita a memorização.
Somado a isso, não temos a necessidade de usar aspas nos nomes das variáveis, o que acelera a digitação.
dplyr
select()
dplyr
Seleção de colunas - select()
Ordenar linhas - arrange()
dplyr
Seleção de colunas - select()
Ordenar linhas - arrange()
Filtrar linhas - filter()
dplyr
Seleção de colunas - select()
Ordenar linhas - arrange()
Filtrar linhas - filter()
Criar novas colunas - mutate()
dplyr
Seleção de colunas - select()
Ordenar linhas - arrange()
Filtrar linhas - filter()
Criar novas colunas - mutate()
Sumarizar resultados - summarise()
dplyr
Seleção de colunas - select()
Ordenar linhas - arrange()
Filtrar linhas - filter()
Criar novas colunas - mutate()
Sumarizar resultados - summarise()
Função especial para agrupamentos - group_by()
library("MASS")library("dplyr")
library("dplyr")library("MASS")
select()
Podemos selecionar quantas colunas desejarmos.
select()
Podemos selecionar quantas colunas desejarmos.
select(dados, especimenid)
## # A tibble: 48 × 1## especimenid## <int>## 1 10194## 2 10194## 3 10194## 4 10194## 5 10194## 6 10194## 7 10194## 8 10194## 9 10196## 10 10196## # … with 38 more rows
Para selecionar uma coluna, usamos a função select().
O primeiro argumento é o nome do data.frame, dados
; a partir do segundo argumento, colocamos os nomes das colunas sem aspas.
select()
select(dados, especimenid, SP1)
## # A tibble: 48 × 2## especimenid SP1 ## <int> <chr> ## 1 10194 P. aracouchini## 2 10194 P. aracouchini## 3 10194 P. aracouchini## 4 10194 P. aracouchini## 5 10194 P. aracouchini## 6 10194 P. aracouchini## 7 10194 P. aracouchini## 8 10194 P. aracouchini## 9 10196 P. aracouchini## 10 10196 P. aracouchini## # … with 38 more rows
select()
select(dados, especimenid, SP1, coletor, number)
## # A tibble: 48 × 4## especimenid SP1 coletor number## <int> <chr> <chr> <int>## 1 10194 P. aracouchini Perdiz, R.O. 2856## 2 10194 P. aracouchini Perdiz, R.O. 2856## 3 10194 P. aracouchini Perdiz, R.O. 2856## 4 10194 P. aracouchini Perdiz, R.O. 2856## 5 10194 P. aracouchini Perdiz, R.O. 2856## 6 10194 P. aracouchini Perdiz, R.O. 2856## 7 10194 P. aracouchini Perdiz, R.O. 2856## 8 10194 P. aracouchini Perdiz, R.O. 2856## 9 10196 P. aracouchini Perdiz, R.O. 2858## 10 10196 P. aracouchini Perdiz, R.O. 2858## # … with 38 more rows
dados_1colunaremovida <- select(dados, -especimenid)head(dados_1colunaremovida)
## # A tibble: 6 × 1,561## SP1 face coletor number X10001.03 X3999.64 X4003.497 X4007.354## <chr> <chr> <chr> <int> <dbl> <dbl> <dbl> <dbl>## 1 P. aracouch… abax… Perdiz… 2856 0.278 0.596 0.596 0.596## 2 P. aracouch… adax… Perdiz… 2856 0.254 0.567 0.567 0.567## 3 P. aracouch… abax… Perdiz… 2856 0.273 0.581 0.582 0.582## 4 P. aracouch… adax… Perdiz… 2856 0.258 0.576 0.577 0.577## 5 P. aracouch… abax… Perdiz… 2856 0.278 0.596 0.596 0.596## 6 P. aracouch… adax… Perdiz… 2856 0.254 0.567 0.567 0.567## # … with 1,553 more variables: X4011.211 <dbl>, X4015.068 <dbl>,## # X4018.925 <dbl>, X4022.781 <dbl>, X4026.638 <dbl>, X4030.495 <dbl>,## # X4034.352 <dbl>, X4038.209 <dbl>, X4042.066 <dbl>, X4045.923 <dbl>,## # X4049.78 <dbl>, X4053.637 <dbl>, X4057.494 <dbl>, X4061.351 <dbl>,## # X4065.208 <dbl>, X4069.065 <dbl>, X4072.922 <dbl>, X4076.779 <dbl>,## # X4080.635 <dbl>, X4084.492 <dbl>, X4088.349 <dbl>, X4092.206 <dbl>,## # X4096.063 <dbl>, X4099.92 <dbl>, X4103.777 <dbl>, X4107.634 <dbl>, …
dados_2colunasremovidas <- select(dados, -especimenid, -SP1)head(dados_2colunasremovidas)
## # A tibble: 6 × 1,560## face coletor number X10001.03 X3999.64 X4003.497 X4007.354 X4011.211## <chr> <chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl>## 1 abaxial Perdiz,… 2856 0.278 0.596 0.596 0.596 0.596## 2 adaxial Perdiz,… 2856 0.254 0.567 0.567 0.567 0.567## 3 abaxial Perdiz,… 2856 0.273 0.581 0.582 0.582 0.582## 4 adaxial Perdiz,… 2856 0.258 0.576 0.577 0.577 0.577## 5 abaxial Perdiz,… 2856 0.278 0.596 0.596 0.596 0.596## 6 adaxial Perdiz,… 2856 0.254 0.567 0.567 0.567 0.567## # … with 1,552 more variables: X4015.068 <dbl>, X4018.925 <dbl>,## # X4022.781 <dbl>, X4026.638 <dbl>, X4030.495 <dbl>, X4034.352 <dbl>,## # X4038.209 <dbl>, X4042.066 <dbl>, X4045.923 <dbl>, X4049.78 <dbl>,## # X4053.637 <dbl>, X4057.494 <dbl>, X4061.351 <dbl>, X4065.208 <dbl>,## # X4069.065 <dbl>, X4072.922 <dbl>, X4076.779 <dbl>, X4080.635 <dbl>,## # X4084.492 <dbl>, X4088.349 <dbl>, X4092.206 <dbl>, X4096.063 <dbl>,## # X4099.92 <dbl>, X4103.777 <dbl>, X4107.634 <dbl>, X4111.491 <dbl>, …
multiplas_colunas_removidas <- select(dados, -one_of(c("especimenid", "SP1", "face")))head(multiplas_colunas_removidas)
## # A tibble: 6 × 1,559## coletor number X10001.03 X3999.64 X4003.497 X4007.354 X4011.211## <chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl>## 1 Perdiz, R.O. 2856 0.278 0.596 0.596 0.596 0.596## 2 Perdiz, R.O. 2856 0.254 0.567 0.567 0.567 0.567## 3 Perdiz, R.O. 2856 0.273 0.581 0.582 0.582 0.582## 4 Perdiz, R.O. 2856 0.258 0.576 0.577 0.577 0.577## 5 Perdiz, R.O. 2856 0.278 0.596 0.596 0.596 0.596## 6 Perdiz, R.O. 2856 0.254 0.567 0.567 0.567 0.567## # … with 1,552 more variables: X4015.068 <dbl>, X4018.925 <dbl>,## # X4022.781 <dbl>, X4026.638 <dbl>, X4030.495 <dbl>, X4034.352 <dbl>,## # X4038.209 <dbl>, X4042.066 <dbl>, X4045.923 <dbl>, X4049.78 <dbl>,## # X4053.637 <dbl>, X4057.494 <dbl>, X4061.351 <dbl>, X4065.208 <dbl>,## # X4069.065 <dbl>, X4072.922 <dbl>, X4076.779 <dbl>, X4080.635 <dbl>,## # X4084.492 <dbl>, X4088.349 <dbl>, X4092.206 <dbl>, X4096.063 <dbl>,## # X4099.92 <dbl>, X4103.777 <dbl>, X4107.634 <dbl>, X4111.491 <dbl>, …
select(dados, SP1, number, coletor)
## # A tibble: 48 × 3## SP1 number coletor ## <chr> <int> <chr> ## 1 P. aracouchini 2856 Perdiz, R.O.## 2 P. aracouchini 2856 Perdiz, R.O.## 3 P. aracouchini 2856 Perdiz, R.O.## 4 P. aracouchini 2856 Perdiz, R.O.## 5 P. aracouchini 2856 Perdiz, R.O.## 6 P. aracouchini 2856 Perdiz, R.O.## 7 P. aracouchini 2856 Perdiz, R.O.## 8 P. aracouchini 2856 Perdiz, R.O.## 9 P. aracouchini 2858 Perdiz, R.O.## 10 P. aracouchini 2858 Perdiz, R.O.## # … with 38 more rows
everything()
select(dados, coletor, number, everything())
## # A tibble: 48 × 1,562## coletor number especimenid SP1 face X10001.03 X3999.64 X4003.497## <chr> <int> <int> <chr> <chr> <dbl> <dbl> <dbl>## 1 Perdiz, R.… 2856 10194 P. a… abax… 0.278 0.596 0.596## 2 Perdiz, R.… 2856 10194 P. a… adax… 0.254 0.567 0.567## 3 Perdiz, R.… 2856 10194 P. a… abax… 0.273 0.581 0.582## 4 Perdiz, R.… 2856 10194 P. a… adax… 0.258 0.576 0.577## 5 Perdiz, R.… 2856 10194 P. a… abax… 0.278 0.596 0.596## 6 Perdiz, R.… 2856 10194 P. a… adax… 0.254 0.567 0.567## 7 Perdiz, R.… 2856 10194 P. a… abax… 0.273 0.581 0.582## 8 Perdiz, R.… 2856 10194 P. a… adax… 0.258 0.576 0.577## 9 Perdiz, R.… 2858 10196 P. a… abax… 0.274 0.681 0.681## 10 Perdiz, R.… 2858 10196 P. a… adax… 0.278 0.673 0.672## # … with 38 more rows, and 1,554 more variables: X4007.354 <dbl>,## # X4011.211 <dbl>, X4015.068 <dbl>, X4018.925 <dbl>, X4022.781 <dbl>,## # X4026.638 <dbl>, X4030.495 <dbl>, X4034.352 <dbl>, X4038.209 <dbl>,## # X4042.066 <dbl>, X4045.923 <dbl>, X4049.78 <dbl>, X4053.637 <dbl>,## # X4057.494 <dbl>, X4061.351 <dbl>, X4065.208 <dbl>, X4069.065 <dbl>,## # X4072.922 <dbl>, X4076.779 <dbl>, X4080.635 <dbl>, X4084.492 <dbl>,## # X4088.349 <dbl>, X4092.206 <dbl>, X4096.063 <dbl>, X4099.92 <dbl>, …
select()
Há verbos que auxiliam a busca das colunas desejadas. São eles:
select()
Há verbos que auxiliam a busca das colunas desejadas. São eles:
starts_with()
: Coluna começa com um prefixo X;ends_with()
: Termina com um sufixo X;contains()
: Contem uma determinada palavra;matches()
: Busca uma expressão regular (veja ?regex
);num_range()
: Busca uma amplitude numérica.starts_with()
select(dados, starts_with("col"))
## # A tibble: 48 × 1## coletor ## <chr> ## 1 Perdiz, R.O.## 2 Perdiz, R.O.## 3 Perdiz, R.O.## 4 Perdiz, R.O.## 5 Perdiz, R.O.## 6 Perdiz, R.O.## 7 Perdiz, R.O.## 8 Perdiz, R.O.## 9 Perdiz, R.O.## 10 Perdiz, R.O.## # … with 38 more rows
ends_with()
select(dados, ends_with("r"))
## # A tibble: 48 × 2## coletor number## <chr> <int>## 1 Perdiz, R.O. 2856## 2 Perdiz, R.O. 2856## 3 Perdiz, R.O. 2856## 4 Perdiz, R.O. 2856## 5 Perdiz, R.O. 2856## 6 Perdiz, R.O. 2856## 7 Perdiz, R.O. 2856## 8 Perdiz, R.O. 2856## 9 Perdiz, R.O. 2858## 10 Perdiz, R.O. 2858## # … with 38 more rows
contains()
select(dados, contains("ol"))
## # A tibble: 48 × 1## coletor ## <chr> ## 1 Perdiz, R.O.## 2 Perdiz, R.O.## 3 Perdiz, R.O.## 4 Perdiz, R.O.## 5 Perdiz, R.O.## 6 Perdiz, R.O.## 7 Perdiz, R.O.## 8 Perdiz, R.O.## 9 Perdiz, R.O.## 10 Perdiz, R.O.## # … with 38 more rows
matches()
select(dados, matches("^X[0-9]+\\.97$"))
## # A tibble: 48 × 1## X8438.97## <dbl>## 1 0.294## 2 0.271## 3 0.290## 4 0.275## 5 0.294## 6 0.271## 7 0.290## 8 0.275## 9 0.285## 10 0.290## # … with 38 more rows
num_range()
select(dados, num_range("X", seq(from = 3999.64, to = 4007.354, by = 3.857)))
## # A tibble: 48 × 3## X3999.64 X4003.497 X4007.354## <dbl> <dbl> <dbl>## 1 0.596 0.596 0.596## 2 0.567 0.567 0.567## 3 0.581 0.582 0.582## 4 0.576 0.577 0.577## 5 0.596 0.596 0.596## 6 0.567 0.567 0.567## 7 0.581 0.582 0.582## 8 0.576 0.577 0.577## 9 0.681 0.681 0.681## 10 0.673 0.672 0.672## # … with 38 more rows
distinct()
Ao selecionar diversas colunas, podemos querer ver combinações distintas de linhas.
distinct()
Ao selecionar diversas colunas, podemos querer ver combinações distintas de linhas.
Usamos então a função distinct()
para obter essas combinações:
distinct(dados, coletor, number, SP1)
## # A tibble: 6 × 3## SP1 coletor number## <chr> <chr> <int>## 1 P. aracouchini Perdiz, R.O. 2856## 2 P. aracouchini Perdiz, R.O. 2858## 3 P. aracouchini Perdiz, R.O. 2859## 4 P. calanense Perdiz, R.O. 3236## 5 P. calanense Perdiz, R.O. 3237## 6 P. calanense Perdiz, R.O. 3239
arrange()
arrange(dados, number)
## # A tibble: 48 × 1,562## especimenid SP1 face coletor number X10001.03 X3999.64 X4003.497## <int> <chr> <chr> <chr> <int> <dbl> <dbl> <dbl>## 1 10194 P. araco… abax… Perdiz… 2856 0.278 0.596 0.596## 2 10194 P. araco… adax… Perdiz… 2856 0.254 0.567 0.567## 3 10194 P. araco… abax… Perdiz… 2856 0.273 0.581 0.582## 4 10194 P. araco… adax… Perdiz… 2856 0.258 0.576 0.577## 5 10194 P. araco… abax… Perdiz… 2856 0.278 0.596 0.596## 6 10194 P. araco… adax… Perdiz… 2856 0.254 0.567 0.567## 7 10194 P. araco… abax… Perdiz… 2856 0.273 0.581 0.582## 8 10194 P. araco… adax… Perdiz… 2856 0.258 0.576 0.577## 9 10196 P. araco… abax… Perdiz… 2858 0.274 0.681 0.681## 10 10196 P. araco… adax… Perdiz… 2858 0.278 0.673 0.672## # … with 38 more rows, and 1,554 more variables: X4007.354 <dbl>,## # X4011.211 <dbl>, X4015.068 <dbl>, X4018.925 <dbl>, X4022.781 <dbl>,## # X4026.638 <dbl>, X4030.495 <dbl>, X4034.352 <dbl>, X4038.209 <dbl>,## # X4042.066 <dbl>, X4045.923 <dbl>, X4049.78 <dbl>, X4053.637 <dbl>,## # X4057.494 <dbl>, X4061.351 <dbl>, X4065.208 <dbl>, X4069.065 <dbl>,## # X4072.922 <dbl>, X4076.779 <dbl>, X4080.635 <dbl>, X4084.492 <dbl>,## # X4088.349 <dbl>, X4092.206 <dbl>, X4096.063 <dbl>, X4099.92 <dbl>, …
arrange()
arrange(dados, desc(number))
## # A tibble: 48 × 1,562## especimenid SP1 face coletor number X10001.03 X3999.64 X4003.497## <int> <chr> <chr> <chr> <int> <dbl> <dbl> <dbl>## 1 12650 P. calan… abax… Perdiz… 3239 0.349 0.733 0.733## 2 12650 P. calan… adax… Perdiz… 3239 0.342 0.744 0.744## 3 12650 P. calan… abax… Perdiz… 3239 0.342 0.713 0.714## 4 12650 P. calan… adax… Perdiz… 3239 0.355 0.773 0.773## 5 12650 P. calan… abax… Perdiz… 3239 0.349 0.733 0.733## 6 12650 P. calan… adax… Perdiz… 3239 0.342 0.744 0.744## 7 12650 P. calan… abax… Perdiz… 3239 0.342 0.713 0.714## 8 12650 P. calan… adax… Perdiz… 3239 0.355 0.773 0.773## 9 12648 P. calan… abax… Perdiz… 3237 0.402 0.745 0.746## 10 12648 P. calan… adax… Perdiz… 3237 0.389 0.757 0.757## # … with 38 more rows, and 1,554 more variables: X4007.354 <dbl>,## # X4011.211 <dbl>, X4015.068 <dbl>, X4018.925 <dbl>, X4022.781 <dbl>,## # X4026.638 <dbl>, X4030.495 <dbl>, X4034.352 <dbl>, X4038.209 <dbl>,## # X4042.066 <dbl>, X4045.923 <dbl>, X4049.78 <dbl>, X4053.637 <dbl>,## # X4057.494 <dbl>, X4061.351 <dbl>, X4065.208 <dbl>, X4069.065 <dbl>,## # X4072.922 <dbl>, X4076.779 <dbl>, X4080.635 <dbl>, X4084.492 <dbl>,## # X4088.349 <dbl>, X4092.206 <dbl>, X4096.063 <dbl>, X4099.92 <dbl>, …
filter()
filter(dados, SP1 == "P. calanense")
## # A tibble: 24 × 1,562## especimenid SP1 face coletor number X10001.03 X3999.64 X4003.497## <int> <chr> <chr> <chr> <int> <dbl> <dbl> <dbl>## 1 12647 P. calan… abax… Perdiz… 3236 0.322 0.717 0.717## 2 12647 P. calan… adax… Perdiz… 3236 0.329 0.714 0.715## 3 12647 P. calan… abax… Perdiz… 3236 0.340 0.724 0.724## 4 12647 P. calan… adax… Perdiz… 3236 0.320 0.735 0.736## 5 12647 P. calan… abax… Perdiz… 3236 0.322 0.717 0.717## 6 12647 P. calan… adax… Perdiz… 3236 0.329 0.714 0.715## 7 12647 P. calan… abax… Perdiz… 3236 0.340 0.724 0.724## 8 12647 P. calan… adax… Perdiz… 3236 0.320 0.735 0.736## 9 12648 P. calan… abax… Perdiz… 3237 0.402 0.745 0.746## 10 12648 P. calan… adax… Perdiz… 3237 0.389 0.757 0.757## # … with 14 more rows, and 1,554 more variables: X4007.354 <dbl>,## # X4011.211 <dbl>, X4015.068 <dbl>, X4018.925 <dbl>, X4022.781 <dbl>,## # X4026.638 <dbl>, X4030.495 <dbl>, X4034.352 <dbl>, X4038.209 <dbl>,## # X4042.066 <dbl>, X4045.923 <dbl>, X4049.78 <dbl>, X4053.637 <dbl>,## # X4057.494 <dbl>, X4061.351 <dbl>, X4065.208 <dbl>, X4069.065 <dbl>,## # X4072.922 <dbl>, X4076.779 <dbl>, X4080.635 <dbl>, X4084.492 <dbl>,## # X4088.349 <dbl>, X4092.206 <dbl>, X4096.063 <dbl>, X4099.92 <dbl>, …
filter(dados, SP1 == "P. calanense", number == 3237)
## # A tibble: 8 × 1,562## especimenid SP1 face coletor number X10001.03 X3999.64 X4003.497## <int> <chr> <chr> <chr> <int> <dbl> <dbl> <dbl>## 1 12648 P. calane… abax… Perdiz… 3237 0.402 0.745 0.746## 2 12648 P. calane… adax… Perdiz… 3237 0.389 0.757 0.757## 3 12648 P. calane… abax… Perdiz… 3237 0.418 0.748 0.749## 4 12648 P. calane… adax… Perdiz… 3237 0.363 0.725 0.725## 5 12648 P. calane… abax… Perdiz… 3237 0.402 0.745 0.746## 6 12648 P. calane… adax… Perdiz… 3237 0.389 0.757 0.757## 7 12648 P. calane… abax… Perdiz… 3237 0.418 0.748 0.749## 8 12648 P. calane… adax… Perdiz… 3237 0.363 0.725 0.725## # … with 1,554 more variables: X4007.354 <dbl>, X4011.211 <dbl>,## # X4015.068 <dbl>, X4018.925 <dbl>, X4022.781 <dbl>, X4026.638 <dbl>,## # X4030.495 <dbl>, X4034.352 <dbl>, X4038.209 <dbl>, X4042.066 <dbl>,## # X4045.923 <dbl>, X4049.78 <dbl>, X4053.637 <dbl>, X4057.494 <dbl>,## # X4061.351 <dbl>, X4065.208 <dbl>, X4069.065 <dbl>, X4072.922 <dbl>,## # X4076.779 <dbl>, X4080.635 <dbl>, X4084.492 <dbl>, X4088.349 <dbl>,## # X4092.206 <dbl>, X4096.063 <dbl>, X4099.92 <dbl>, X4103.777 <dbl>, …
,
em filter()
equivale a &
mutate()
nova_coluna <- mutate(dados, calanense = ifelse(SP1 == "P. calanense", 1, 0))select(nova_coluna, SP1, calanense)
## # A tibble: 48 × 2## SP1 calanense## <chr> <dbl>## 1 P. aracouchini 0## 2 P. aracouchini 0## 3 P. aracouchini 0## 4 P. aracouchini 0## 5 P. aracouchini 0## 6 P. aracouchini 0## 7 P. aracouchini 0## 8 P. aracouchini 0## 9 P. aracouchini 0## 10 P. aracouchini 0## # … with 38 more rows
summarise()
summarise(dados, media_X8438.97 = mean(X8438.97))
## # A tibble: 1 × 1## media_X8438.97## <dbl>## 1 0.327
A função summarise()
colapsa um data.frame
em uma única linha.
No entanto, a verdadeira utilidade dessa função se manifesta ao utilizarmos a função group_by
para destacar os agrupamentos que desejamos fazer dentro dos dados.
group_by
dados_agrupados <- group_by(dados, SP1)dados_agrupados[1:5, 1:10]
## # A tibble: 5 × 10## # Groups: SP1 [1]## especimenid SP1 face coletor number X10001.03 X3999.64 X4003.497## <int> <chr> <chr> <chr> <int> <dbl> <dbl> <dbl>## 1 10194 P. aracou… abax… Perdiz… 2856 0.278 0.596 0.596## 2 10194 P. aracou… adax… Perdiz… 2856 0.254 0.567 0.567## 3 10194 P. aracou… abax… Perdiz… 2856 0.273 0.581 0.582## 4 10194 P. aracou… adax… Perdiz… 2856 0.258 0.576 0.577## 5 10194 P. aracou… abax… Perdiz… 2856 0.278 0.596 0.596## # … with 2 more variables: X4007.354 <dbl>, X4011.211 <dbl>
group_by
dados_agrupados <- group_by(dados, SP1)dados_agrupados[1:5, 1:10]
## # A tibble: 5 × 10## # Groups: SP1 [1]## especimenid SP1 face coletor number X10001.03 X3999.64 X4003.497## <int> <chr> <chr> <chr> <int> <dbl> <dbl> <dbl>## 1 10194 P. aracou… abax… Perdiz… 2856 0.278 0.596 0.596## 2 10194 P. aracou… adax… Perdiz… 2856 0.254 0.567 0.567## 3 10194 P. aracou… abax… Perdiz… 2856 0.273 0.581 0.582## 4 10194 P. aracou… adax… Perdiz… 2856 0.258 0.576 0.577## 5 10194 P. aracou… abax… Perdiz… 2856 0.278 0.596 0.596## # … with 2 more variables: X4007.354 <dbl>, X4011.211 <dbl>
Os dados estão agrupados?
is_grouped_df(dados_agrupados)
## [1] TRUE
Suponhemos que eu queira ver médias de determinada variável para as espécies de meu conjunto de dados.
Usamos a função group_by
para agrupar os dados em torno da variável SP1
.
À primeira vista, não há resultado aparente.
Porém, ao usarmos essa função is_grouped_df()
, temos a certeza de que os dados estão agrupados.
Não se preocupem em aprender essa função.
Foquem na lição a seguir.
summarise(dados_agrupados, media_X8438.97 = mean(X8438.97))
## # A tibble: 2 × 2## SP1 media_X8438.97## <chr> <dbl>## 1 P. aracouchini 0.285## 2 P. calanense 0.369
Vamos sumarizar os dados para a variável X8438.97
.
dados_agrupados2 <- group_by( select(dados, SP1, ends_with("7")), SP1 )summarise_all(dados_agrupados2, .funs = mean)
## # A tibble: 2 × 172## SP1 X4003.497 X4053.637 X4103.777 X4153.917 X4204.057 X4238.77## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>## 1 P. aracouchi… 0.651 0.626 0.576 0.547 0.544 0.546## 2 P. calanense 0.736 0.709 0.653 0.622 0.620 0.625## # … with 165 more variables: X4254.197 <dbl>, X4292.767 <dbl>,## # X4304.337 <dbl>, X4342.907 <dbl>, X4393.047 <dbl>, X4443.187 <dbl>,## # X4489.47 <dbl>, X4493.327 <dbl>, X4543.467 <dbl>, X4582.037 <dbl>,## # X4593.607 <dbl>, X4632.177 <dbl>, X4682.317 <dbl>, X4732.457 <dbl>,## # X4782.597 <dbl>, X4821.167 <dbl>, X4832.737 <dbl>, X4871.307 <dbl>,## # X4882.877 <dbl>, X4921.447 <dbl>, X4971.587 <dbl>, X5017.87 <dbl>,## # X5021.727 <dbl>, X5071.867 <dbl>, X5110.437 <dbl>, X5122.007 <dbl>, …
ls()
.ls()
.%>%
(pacote magrittr)|>
(a partir do R 4.1).summarise_all(group_by(filter(select(dados, SP1, ends_with("7")), SP1 == "P. calanense"), SP1), .funs = mean)
## # A tibble: 1 × 172## SP1 X4003.497 X4053.637 X4103.777 X4153.917 X4204.057 X4238.77## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>## 1 P. calanense 0.736 0.709 0.653 0.622 0.620 0.625## # … with 165 more variables: X4254.197 <dbl>, X4292.767 <dbl>,## # X4304.337 <dbl>, X4342.907 <dbl>, X4393.047 <dbl>, X4443.187 <dbl>,## # X4489.47 <dbl>, X4493.327 <dbl>, X4543.467 <dbl>, X4582.037 <dbl>,## # X4593.607 <dbl>, X4632.177 <dbl>, X4682.317 <dbl>, X4732.457 <dbl>,## # X4782.597 <dbl>, X4821.167 <dbl>, X4832.737 <dbl>, X4871.307 <dbl>,## # X4882.877 <dbl>, X4921.447 <dbl>, X4971.587 <dbl>, X5017.87 <dbl>,## # X5021.727 <dbl>, X5071.867 <dbl>, X5110.437 <dbl>, X5122.007 <dbl>, …
dados_selecionados <- select(dados, SP1, ends_with("7"))dados_filtrados <- filter(dados_selecionados, SP1 == "P. calanense")dados_agrupados3 <- group_by(dados_filtrados, SP1)summarise_all(dados_agrupados3, .funs = mean)
## # A tibble: 1 × 172## SP1 X4003.497 X4053.637 X4103.777 X4153.917 X4204.057 X4238.77## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>## 1 P. calanense 0.736 0.709 0.653 0.622 0.620 0.625## # … with 165 more variables: X4254.197 <dbl>, X4292.767 <dbl>,## # X4304.337 <dbl>, X4342.907 <dbl>, X4393.047 <dbl>, X4443.187 <dbl>,## # X4489.47 <dbl>, X4493.327 <dbl>, X4543.467 <dbl>, X4582.037 <dbl>,## # X4593.607 <dbl>, X4632.177 <dbl>, X4682.317 <dbl>, X4732.457 <dbl>,## # X4782.597 <dbl>, X4821.167 <dbl>, X4832.737 <dbl>, X4871.307 <dbl>,## # X4882.877 <dbl>, X4921.447 <dbl>, X4971.587 <dbl>, X5017.87 <dbl>,## # X5021.727 <dbl>, X5071.867 <dbl>, X5110.437 <dbl>, X5122.007 <dbl>, …
Porém, a criação de objetos intermediários "suja" a área de trabalho com objetos que, muitas vezes, não chegarão a serem utilizados novamente
%>%
select(dados, SP1, ends_with("7")) %>% filter(., SP1 == "P. calanense") %>% group_by(., SP1) %>% summarise_all(., .funs = mean)
## # A tibble: 1 × 172## SP1 X4003.497 X4053.637 X4103.777 X4153.917 X4204.057 X4238.77## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>## 1 P. calanense 0.736 0.709 0.653 0.622 0.620 0.625## # … with 165 more variables: X4254.197 <dbl>, X4292.767 <dbl>,## # X4304.337 <dbl>, X4342.907 <dbl>, X4393.047 <dbl>, X4443.187 <dbl>,## # X4489.47 <dbl>, X4493.327 <dbl>, X4543.467 <dbl>, X4582.037 <dbl>,## # X4593.607 <dbl>, X4632.177 <dbl>, X4682.317 <dbl>, X4732.457 <dbl>,## # X4782.597 <dbl>, X4821.167 <dbl>, X4832.737 <dbl>, X4871.307 <dbl>,## # X4882.877 <dbl>, X4921.447 <dbl>, X4971.587 <dbl>, X5017.87 <dbl>,## # X5021.727 <dbl>, X5071.867 <dbl>, X5110.437 <dbl>, X5122.007 <dbl>, …
Suponha que você deseja obter valores de média de cada variável NIR por indivíduo.
Suponha que você deseja obter valores de média de cada variável NIR por indivíduo.
No conjunto de dados exemplo desta oficina, dados
, indivíduos são reconhecidos pela variável especimenid
.
Suponha que você deseja obter valores de média de cada variável NIR por indivíduo.
No conjunto de dados exemplo desta oficina, dados
, indivíduos são reconhecidos pela variável especimenid
.
Logo, esta variável, especimenid
, será nosso agrupamento.
%>%
)summarise_all( group_by(select(dados, especimenid, SP1, starts_with("X")), especimenid, SP1), .funs = mean)
## # A tibble: 6 × 1,559## # Groups: especimenid [6]## especimenid SP1 X10001.03 X3999.64 X4003.497 X4007.354 X4011.211## <int> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>## 1 10194 P. aracouc… 0.266 0.580 0.581 0.580 0.580## 2 10196 P. aracouc… 0.274 0.692 0.692 0.692 0.691## 3 10197 P. aracouc… 0.274 0.680 0.680 0.680 0.680## 4 12647 P. calanen… 0.328 0.723 0.723 0.723 0.723## 5 12648 P. calanen… 0.393 0.744 0.744 0.744 0.744## 6 12650 P. calanen… 0.347 0.741 0.741 0.741 0.741## # … with 1,552 more variables: X4015.068 <dbl>, X4018.925 <dbl>,## # X4022.781 <dbl>, X4026.638 <dbl>, X4030.495 <dbl>, X4034.352 <dbl>,## # X4038.209 <dbl>, X4042.066 <dbl>, X4045.923 <dbl>, X4049.78 <dbl>,## # X4053.637 <dbl>, X4057.494 <dbl>, X4061.351 <dbl>, X4065.208 <dbl>,## # X4069.065 <dbl>, X4072.922 <dbl>, X4076.779 <dbl>, X4080.635 <dbl>,## # X4084.492 <dbl>, X4088.349 <dbl>, X4092.206 <dbl>, X4096.063 <dbl>,## # X4099.92 <dbl>, X4103.777 <dbl>, X4107.634 <dbl>, X4111.491 <dbl>, …
%>%
Mesmo cálculo do slide anterior
dados %>% select(., especimenid, SP1, starts_with("X")) %>% group_by(., especimenid, SP1) %>% summarise_all(., .funs = mean)
## # A tibble: 6 × 1,559## # Groups: especimenid [6]## especimenid SP1 X10001.03 X3999.64 X4003.497 X4007.354 X4011.211## <int> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>## 1 10194 P. aracouc… 0.266 0.580 0.581 0.580 0.580## 2 10196 P. aracouc… 0.274 0.692 0.692 0.692 0.691## 3 10197 P. aracouc… 0.274 0.680 0.680 0.680 0.680## 4 12647 P. calanen… 0.328 0.723 0.723 0.723 0.723## 5 12648 P. calanen… 0.393 0.744 0.744 0.744 0.744## 6 12650 P. calanen… 0.347 0.741 0.741 0.741 0.741## # … with 1,552 more variables: X4015.068 <dbl>, X4018.925 <dbl>,## # X4022.781 <dbl>, X4026.638 <dbl>, X4030.495 <dbl>, X4034.352 <dbl>,## # X4038.209 <dbl>, X4042.066 <dbl>, X4045.923 <dbl>, X4049.78 <dbl>,## # X4053.637 <dbl>, X4057.494 <dbl>, X4061.351 <dbl>, X4065.208 <dbl>,## # X4069.065 <dbl>, X4072.922 <dbl>, X4076.779 <dbl>, X4080.635 <dbl>,## # X4084.492 <dbl>, X4088.349 <dbl>, X4092.206 <dbl>, X4096.063 <dbl>,## # X4099.92 <dbl>, X4103.777 <dbl>, X4107.634 <dbl>, X4111.491 <dbl>, …
%>%
)summarise_all( group_by(select(dados, especimenid, SP1, face, starts_with("X")), especimenid, SP1, face), .funs = mean)
## # A tibble: 12 × 1,560## # Groups: especimenid, SP1 [6]## especimenid SP1 face X10001.03 X3999.64 X4003.497 X4007.354## <int> <chr> <chr> <dbl> <dbl> <dbl> <dbl>## 1 10194 P. aracouchini abax… 0.275 0.589 0.589 0.589## 2 10194 P. aracouchini adax… 0.256 0.572 0.572 0.572## 3 10196 P. aracouchini abax… 0.275 0.692 0.692 0.692## 4 10196 P. aracouchini adax… 0.272 0.692 0.692 0.692## 5 10197 P. aracouchini abax… 0.273 0.675 0.675 0.675## 6 10197 P. aracouchini adax… 0.274 0.686 0.686 0.685## 7 12647 P. calanense abax… 0.331 0.720 0.721 0.720## 8 12647 P. calanense adax… 0.324 0.725 0.725 0.725## 9 12648 P. calanense abax… 0.410 0.747 0.747 0.747## 10 12648 P. calanense adax… 0.376 0.741 0.741 0.741## 11 12650 P. calanense abax… 0.346 0.723 0.723 0.724## 12 12650 P. calanense adax… 0.349 0.758 0.759 0.759## # … with 1,553 more variables: X4011.211 <dbl>, X4015.068 <dbl>,## # X4018.925 <dbl>, X4022.781 <dbl>, X4026.638 <dbl>, X4030.495 <dbl>,## # X4034.352 <dbl>, X4038.209 <dbl>, X4042.066 <dbl>, X4045.923 <dbl>,## # X4049.78 <dbl>, X4053.637 <dbl>, X4057.494 <dbl>, X4061.351 <dbl>,## # X4065.208 <dbl>, X4069.065 <dbl>, X4072.922 <dbl>, X4076.779 <dbl>,## # X4080.635 <dbl>, X4084.492 <dbl>, X4088.349 <dbl>, X4092.206 <dbl>,## # X4096.063 <dbl>, X4099.92 <dbl>, X4103.777 <dbl>, X4107.634 <dbl>, …
%>%
Mesmo cálculo do slide anterior
dados %>% select(., especimenid, SP1, face, starts_with("X")) %>% group_by(., especimenid, SP1, face) %>% summarise_all(., .funs = mean)
## # A tibble: 12 × 1,560## # Groups: especimenid, SP1 [6]## especimenid SP1 face X10001.03 X3999.64 X4003.497 X4007.354## <int> <chr> <chr> <dbl> <dbl> <dbl> <dbl>## 1 10194 P. aracouchini abax… 0.275 0.589 0.589 0.589## 2 10194 P. aracouchini adax… 0.256 0.572 0.572 0.572## 3 10196 P. aracouchini abax… 0.275 0.692 0.692 0.692## 4 10196 P. aracouchini adax… 0.272 0.692 0.692 0.692## 5 10197 P. aracouchini abax… 0.273 0.675 0.675 0.675## 6 10197 P. aracouchini adax… 0.274 0.686 0.686 0.685## 7 12647 P. calanense abax… 0.331 0.720 0.721 0.720## 8 12647 P. calanense adax… 0.324 0.725 0.725 0.725## 9 12648 P. calanense abax… 0.410 0.747 0.747 0.747## 10 12648 P. calanense adax… 0.376 0.741 0.741 0.741## 11 12650 P. calanense abax… 0.346 0.723 0.723 0.724## 12 12650 P. calanense adax… 0.349 0.758 0.759 0.759## # … with 1,553 more variables: X4011.211 <dbl>, X4015.068 <dbl>,## # X4018.925 <dbl>, X4022.781 <dbl>, X4026.638 <dbl>, X4030.495 <dbl>,## # X4034.352 <dbl>, X4038.209 <dbl>, X4042.066 <dbl>, X4045.923 <dbl>,## # X4049.78 <dbl>, X4053.637 <dbl>, X4057.494 <dbl>, X4061.351 <dbl>,## # X4065.208 <dbl>, X4069.065 <dbl>, X4072.922 <dbl>, X4076.779 <dbl>,## # X4080.635 <dbl>, X4084.492 <dbl>, X4088.349 <dbl>, X4092.206 <dbl>,## # X4096.063 <dbl>, X4099.92 <dbl>, X4103.777 <dbl>, X4107.634 <dbl>, …
treino
e teste
Vamos utilizar aqui as funcionalidades dos pacotes dentro da interface tidymodels
(Kuhn et al. 2020).
rsample::initial_split()
(Silge et al. 2021)library("rsample") # initial_split
dados_split <- initial_split(dados, prop = 3/4)dados_split
## <Analysis/Assess/Total>## <36/12/48>
rsample::initial_split(), que é carregado automaticamente ao se chamar o pacote tidymodels
- esta função cria índices para separar o conjunto de dados em treino
e teste
. Por padrão, a função divide o conjunto de dados em 75% para treino
e 25% para teste
. Caso você queira outra proporção, altere o argumento prop
. Em caso de dúvida, veja o ?
desta função executando o comando ?initial_split
.
dados_split <- initial_split(dados, prop = 3/4, strata = "SP1")
rsample::training()
vs. teste rsample::testing()
rsample::training()
vs. teste rsample::testing()
treino <- training(dados_split)table(treino$SP1)
## ## P. aracouchini P. calanense ## 18 18
ambas do mesmo pacote rsample
- ambas recebem o objeto criado com a função initial_split()
, dados_split
, e dividem o treino em conjuntos treino
e teste
, respectivamente:
rsample::training()
vs. teste rsample::testing()
teste <- testing(dados_split)table(teste$SP1)
## ## P. aracouchini P. calanense ## 6 6
set.seed()
set.seed(221015)iris_split <- initial_split(iris, prop = 3/4, strata = "Species")iris_split
## <Analysis/Assess/Total>## <111/39/150>
Vamos estabelecer uma seed
para que vocês cheguem ao mesmo resultado, caso utilizem estas "receitas" durante o aprendizado do tutorial.
Recomendo que vocês executem esses comandos juntamente comigo para que vocês tenham ciência de que a quebra dos dados será igual para todos.
head(training(iris_split), 20)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species## 1 5.1 3.5 1.4 0.2 setosa## 2 4.9 3.0 1.4 0.2 setosa## 3 4.7 3.2 1.3 0.2 setosa## 5 5.0 3.6 1.4 0.2 setosa## 8 5.0 3.4 1.5 0.2 setosa## 9 4.4 2.9 1.4 0.2 setosa## 10 4.9 3.1 1.5 0.1 setosa## 12 4.8 3.4 1.6 0.2 setosa## 13 4.8 3.0 1.4 0.1 setosa## 14 4.3 3.0 1.1 0.1 setosa## 15 5.8 4.0 1.2 0.2 setosa## 16 5.7 4.4 1.5 0.4 setosa## 18 5.1 3.5 1.4 0.3 setosa## 19 5.7 3.8 1.7 0.3 setosa## 20 5.1 3.8 1.5 0.3 setosa## 23 4.6 3.6 1.0 0.2 setosa## 25 4.8 3.4 1.9 0.2 setosa## 26 5.0 3.0 1.6 0.2 setosa## 27 5.0 3.4 1.6 0.4 setosa## 28 5.2 3.5 1.5 0.2 setosa
recipes
(Kuhn e Wickham 2021).recipes
(Kuhn e Wickham 2021).recipes
(Kuhn e Wickham 2021).Seleção de variáveis
Remoção de valores ausentes
recipes
(Kuhn e Wickham 2021).Seleção de variáveis
Remoção de valores ausentes
Transformar valores
recipes
(Kuhn e Wickham 2021).Seleção de variáveis
Remoção de valores ausentes
Transformar valores
etc (ver https://www.tmwr.org/recipes.html#skip-equals-true)
recipes::recipe(FORMULA, data = NomeDoDataFrame)
Ele facilita a criação de "receitas" que permitem a criação e documentação de conjuntos de dados para serem utilizados posteriormente em análises do tidymodels
, permitindo ao usuário um fluxo contínuo de análise de dados e a facilidade na reutilização do mesmo conjunto de dados para diversas análises.
Recomendo o aprendizado destas novas (algumas não tão novas, como é o caso do pacote caret
ferramentas de pré-processamento e análise de dados em R.
A primeira função desta abordagem é a função recipe()
, em que usamos uma fórmula SP1 ~ .
para dizer que SP1
é nossa variável resposta e as demais são as variáveis preditoras, representadas pelo .
na fórmula.
Porém, sabemos que nosso conjunto de dados dados
possui outras variáveis que não são preditoras, como face
e coletor
.
library("recipes")
recipes::recipe(SP1 ~ ., data = dados)
## Recipe## ## Inputs:## ## role #variables## outcome 1## predictor 1561
Aí entra o papel da função update_role()
em que informamos o papel de cada variável extra em nosso conjunto de dados.
Por exemplo, as variáveis coletor
e number
são identificadores da coleta.
Então, iniciamos a função com o objeto contendo a receita, dados_receita
, e colocamos estas duas variáveis, sem aspas, em seguida, seguido do argumento new_role
, em que colocamos um texto informando que papel é esse.
Ao utilizarmos esta receita nos passos de análises, essas variáveis não serão analisadas pois terão a informação desses papéis
que elas têm no conjunto de dados.
recipes::recipe(SP1 ~ ., data = dados) %>% update_role(., coletor, number, new_role = "dados do espécime")
## Recipe## ## Inputs:## ## role #variables## dados do espécime 2## outcome 1## predictor 1559
recipes::recipe(SP1 ~ ., data = dados) %>% update_role(., coletor, number, new_role = "dados do espécime") %>% update_role(., face, new_role = "identificador da face do foliolo")
## Recipe## ## Inputs:## ## role #variables## dados do espécime 2## identificador da face do foliolo 1## outcome 1## predictor 1558
recipes::recipe(SP1 ~ ., data = treino) %>% update_role(., coletor, number, new_role = "dados do espécime") %>% update_role(., face, new_role = "identificador da face do foliolo") %>% update_role(., especimenid, new_role = "id")
## Recipe## ## Inputs:## ## role #variables## dados do espécime 2## id 1## identificador da face do foliolo 1## outcome 1## predictor 1557
dados_receita <- recipes::recipe(SP1 ~ ., data = treino) %>% update_role(., especimenid, new_role = "id") %>% update_role(., coletor, number, new_role = "dados do espécime") %>% update_role(., face, new_role = "identificador da face do foliolo")dados_receita
## Recipe## ## Inputs:## ## role #variables## dados do espécime 2## id 1## identificador da face do foliolo 1## outcome 1## predictor 1557
prep()
dados_receita_prep <- prep(dados_receita)dados_receita_prep
## Recipe## ## Inputs:## ## role #variables## dados do espécime 2## id 1## identificador da face do foliolo 1## outcome 1## predictor 1557## ## Training data contained 36 data points and no missing data.
teste
pós-receita
bake()
teste_processado <- bake(dados_receita_prep, new_data = teste)teste_processado
## # A tibble: 12 × 1,562## especimenid face coletor number X10001.03 X3999.64 X4003.497 X4007.354## <int> <fct> <fct> <int> <dbl> <dbl> <dbl> <dbl>## 1 10194 adax… Perdiz… 2856 0.258 0.576 0.577 0.577## 2 10194 abax… Perdiz… 2856 0.278 0.596 0.596 0.596## 3 10194 abax… Perdiz… 2856 0.273 0.581 0.582 0.582## 4 10196 abax… Perdiz… 2858 0.276 0.703 0.703 0.703## 5 10196 adax… Perdiz… 2858 0.267 0.712 0.712 0.711## 6 10197 abax… Perdiz… 2859 0.276 0.668 0.668 0.668## 7 12647 adax… Perdiz… 3236 0.320 0.735 0.736 0.736## 8 12647 adax… Perdiz… 3236 0.320 0.735 0.736 0.736## 9 12648 adax… Perdiz… 3237 0.389 0.757 0.757 0.757## 10 12650 abax… Perdiz… 3239 0.349 0.733 0.733 0.733## 11 12650 adax… Perdiz… 3239 0.342 0.744 0.744 0.744## 12 12650 adax… Perdiz… 3239 0.355 0.773 0.773 0.773## # … with 1,554 more variables: X4011.211 <dbl>, X4015.068 <dbl>,## # X4018.925 <dbl>, X4022.781 <dbl>, X4026.638 <dbl>, X4030.495 <dbl>,## # X4034.352 <dbl>, X4038.209 <dbl>, X4042.066 <dbl>, X4045.923 <dbl>,## # X4049.78 <dbl>, X4053.637 <dbl>, X4057.494 <dbl>, X4061.351 <dbl>,## # X4065.208 <dbl>, X4069.065 <dbl>, X4072.922 <dbl>, X4076.779 <dbl>,## # X4080.635 <dbl>, X4084.492 <dbl>, X4088.349 <dbl>, X4092.206 <dbl>,## # X4096.063 <dbl>, X4099.92 <dbl>, X4103.777 <dbl>, X4107.634 <dbl>, …
treino
juice()
juice(dados_receita_prep)
## # A tibble: 36 × 1,562## especimenid face coletor number X10001.03 X3999.64 X4003.497 X4007.354## <int> <fct> <fct> <int> <dbl> <dbl> <dbl> <dbl>## 1 10194 abax… Perdiz… 2856 0.278 0.596 0.596 0.596## 2 10194 adax… Perdiz… 2856 0.254 0.567 0.567 0.567## 3 10194 abax… Perdiz… 2856 0.273 0.581 0.582 0.582## 4 10194 adax… Perdiz… 2856 0.254 0.567 0.567 0.567## 5 10194 adax… Perdiz… 2856 0.258 0.576 0.577 0.577## 6 10196 abax… Perdiz… 2858 0.274 0.681 0.681 0.681## 7 10196 adax… Perdiz… 2858 0.278 0.673 0.672 0.672## 8 10196 adax… Perdiz… 2858 0.267 0.712 0.712 0.711## 9 10196 abax… Perdiz… 2858 0.274 0.681 0.681 0.681## 10 10196 adax… Perdiz… 2858 0.278 0.673 0.672 0.672## # … with 26 more rows, and 1,554 more variables: X4011.211 <dbl>,## # X4015.068 <dbl>, X4018.925 <dbl>, X4022.781 <dbl>, X4026.638 <dbl>,## # X4030.495 <dbl>, X4034.352 <dbl>, X4038.209 <dbl>, X4042.066 <dbl>,## # X4045.923 <dbl>, X4049.78 <dbl>, X4053.637 <dbl>, X4057.494 <dbl>,## # X4061.351 <dbl>, X4065.208 <dbl>, X4069.065 <dbl>, X4072.922 <dbl>,## # X4076.779 <dbl>, X4080.635 <dbl>, X4084.492 <dbl>, X4088.349 <dbl>,## # X4092.206 <dbl>, X4096.063 <dbl>, X4099.92 <dbl>, X4103.777 <dbl>, …
# receita para analisedados_receita <- recipes::recipe(SP1 ~ ., data = treino)dados_receita <- update_role(dados_receita, especimenid, new_role = "id")dados_receita <- update_role(dados_receita, coletor, number, new_role = "dados do espécime")dados_receita <- update_role(dados_receita, face, new_role = "identificador da face do foliolo")dados_receita_prep <- prep(dados_receita)dados_receita_prep
# receita para analisedados_receita <- recipes::recipe(SP1 ~ ., data = treino)dados_receita <- update_role(dados_receita, especimenid, new_role = "id")dados_receita <- update_role(dados_receita, coletor, number, new_role = "dados do espécime")dados_receita <- update_role(dados_receita, face, new_role = "identificador da face do foliolo")dados_receita_prep <- prep(dados_receita)dados_receita_prep
%>%
Vejam que os comandos acima ficaram muito repetitivos, pois a receita dados_receita
aparece múltiplas vezes.
Caso utilizássemos o encadeamento de ações proporcionado pelo operador %>%
do pacote magrittr
(Bache e Wickham 2020), o texto ficaria mais limpo.
Porém, devo admitir que isto é uma questão de preferência.
dados_receita_normal <- dados_receita %>% step_normalize(all_predictors())dados_receita_normal
## Recipe## ## Inputs:## ## role #variables## dados do espécime 2## id 1## identificador da face do foliolo 1## outcome 1## predictor 1557## ## Operations:## ## Centering and scaling for all_predictors()
step_*()
step_*()
PCA é um algoritmo matemático que reduz as dimensões dos dados ao mesmo tempo em que mantem a maior parte da variação do conjunto de dados. Ele cumpre essa redução ao identificar direções, chamadas de componentes principais, ao longo das quais a variação dos dados é máxima. Ao utilizar menos componentes, cada amostra pode ser representada por poucas variáveis em oposição à enormidade de variáveis presentes no conjunto de dados brutos. Amostras podem então ser plotadas, permitindo a inferência visual de similaridades e diferenças entre as amostras, e também determinar se as amostras podem ou não ser agrupadas1.
dados_receita_pca <- dados_receita %>% step_pca(all_predictors())dados_receita_pca
## Recipe## ## Inputs:## ## role #variables## dados do espécime 2## id 1## identificador da face do foliolo 1## outcome 1## predictor 1557## ## Operations:## ## No PCA components were extracted.
dados_receita_pca_prep <- dados_receita_pca %>% prep()dados_receita_pca_prep
## Recipe## ## Inputs:## ## role #variables## dados do espécime 2## id 1## identificador da face do foliolo 1## outcome 1## predictor 1557## ## Training data contained 36 data points and no missing data.## ## Operations:## ## PCA extraction with X10001.03, X3999.64, X4003.497, X4007.354,... [trained]
tidy()
pca_tabela <- tidy(dados_receita_pca_prep, 1)pca_tabela
## # A tibble: 56,052 × 4## terms value component id ## <chr> <dbl> <chr> <chr> ## 1 X10001.03 -0.0202 PC1 pca_OTwyZ## 2 X3999.64 -0.0439 PC1 pca_OTwyZ## 3 X4003.497 -0.0440 PC1 pca_OTwyZ## 4 X4007.354 -0.0439 PC1 pca_OTwyZ## 5 X4011.211 -0.0439 PC1 pca_OTwyZ## 6 X4015.068 -0.0439 PC1 pca_OTwyZ## 7 X4018.925 -0.0438 PC1 pca_OTwyZ## 8 X4022.781 -0.0437 PC1 pca_OTwyZ## 9 X4026.638 -0.0436 PC1 pca_OTwyZ## 10 X4030.495 -0.0435 PC1 pca_OTwyZ## # … with 56,042 more rows
## pcs variacao_porcentagem variacao_cumulativa## 1 PC1 9.983774e+01 99.83774## 2 PC2 1.588772e-01 99.99662## 3 PC3 1.852337e-03 99.99847## 4 PC4 7.829202e-04 99.99926## 5 PC5 4.341331e-04 99.99969## 6 PC6 1.443706e-04 99.99984## 7 PC7 1.197724e-04 99.99995## 8 PC8 1.804392e-05 99.99997## 9 PC9 1.109191e-05 99.99998## 10 PC10 5.475665e-06 99.99999## 11 PC11 2.229137e-06 99.99999## 12 PC12 2.093980e-06 99.99999## 13 PC13 1.370498e-06 100.00000## 14 PC14 1.233161e-06 100.00000## 15 PC15 8.109688e-07 100.00000## 16 PC16 5.629829e-07 100.00000## 17 PC17 5.169118e-07 100.00000## 18 PC18 3.935604e-07 100.00000## 19 PC19 3.134876e-07 100.00000## 20 PC20 2.822530e-07 100.00000## 21 PC21 2.382419e-07 100.00000## 22 PC22 1.924840e-07 100.00000## 23 PC23 1.692351e-07 100.00000## 24 PC24 9.965630e-31 100.00000## 25 PC25 9.965630e-31 100.00000## 26 PC26 9.965630e-31 100.00000## 27 PC27 9.965630e-31 100.00000## 28 PC28 9.965630e-31 100.00000## 29 PC29 9.965630e-31 100.00000## 30 PC30 9.965630e-31 100.00000## 31 PC31 9.965630e-31 100.00000## 32 PC32 9.965630e-31 100.00000## 33 PC33 9.965630e-31 100.00000## 34 PC34 9.965630e-31 100.00000## 35 PC35 9.965630e-31 100.00000## 36 PC36 9.965630e-31 100.00000
sdev <- dados_receita_pca_prep$steps[[1]]$res$sdevpercent_variation <- sdev^2 / sum(sdev^2)pca_variacao <- data.frame( pcs = unique(pca_tabela$component), variacao_porcentagem = percent_variation*100, variacao_cumulativa = cumsum(percent_variation*100) )pca_variacao
ggplot2
pc1 <- filter(pca_variacao, pcs == "PC1")pc2 <- filter(pca_variacao, pcs == "PC2")juice(dados_receita_pca_prep) %>% ggplot(aes(PC1, PC2)) + geom_point(aes(color = SP1), alpha = 0.7, size = 2) + xlab(paste0("PC1 (", round(pc1$variacao_porcentagem, 2), "%)")) + ylab(paste0("PC2 (", round(pc2$variacao_porcentagem, 2), "%)"))
dados_receita_normal_pca <- dados_receita_normal %>% step_pca(all_predictors()) %>% prep()dados_receita_normal_pca
## Recipe## ## Inputs:## ## role #variables## dados do espécime 2## id 1## identificador da face do foliolo 1## outcome 1## predictor 1557## ## Training data contained 36 data points and no missing data.## ## Operations:## ## Centering and scaling for X10001.03, X3999.64, X4003.497, X4007.354... [trained]## PCA extraction with X10001.03, X3999.64, X4003.497, X4007.354,... [trained]
tidy(dados_receita_normal_pca, 1)
## # A tibble: 3,114 × 4## terms statistic value id ## <chr> <chr> <dbl> <chr> ## 1 X10001.03 mean 0.315 normalize_0VXeM## 2 X3999.64 mean 0.693 normalize_0VXeM## 3 X4003.497 mean 0.694 normalize_0VXeM## 4 X4007.354 mean 0.694 normalize_0VXeM## 5 X4011.211 mean 0.693 normalize_0VXeM## 6 X4015.068 mean 0.693 normalize_0VXeM## 7 X4018.925 mean 0.692 normalize_0VXeM## 8 X4022.781 mean 0.690 normalize_0VXeM## 9 X4026.638 mean 0.688 normalize_0VXeM## 10 X4030.495 mean 0.686 normalize_0VXeM## # … with 3,104 more rows
tidy(dados_receita_normal_pca, 1) %>% filter(statistic == "mean")
## # A tibble: 1,557 × 4## terms statistic value id ## <chr> <chr> <dbl> <chr> ## 1 X10001.03 mean 0.315 normalize_0VXeM## 2 X3999.64 mean 0.693 normalize_0VXeM## 3 X4003.497 mean 0.694 normalize_0VXeM## 4 X4007.354 mean 0.694 normalize_0VXeM## 5 X4011.211 mean 0.693 normalize_0VXeM## 6 X4015.068 mean 0.693 normalize_0VXeM## 7 X4018.925 mean 0.692 normalize_0VXeM## 8 X4022.781 mean 0.690 normalize_0VXeM## 9 X4026.638 mean 0.688 normalize_0VXeM## 10 X4030.495 mean 0.686 normalize_0VXeM## # … with 1,547 more rows
tidy(dados_receita_normal_pca, 1) %>% filter(statistic == "sd")
## # A tibble: 1,557 × 4## terms statistic value id ## <chr> <chr> <dbl> <chr> ## 1 X10001.03 sd 0.0504 normalize_0VXeM## 2 X3999.64 sd 0.0548 normalize_0VXeM## 3 X4003.497 sd 0.0548 normalize_0VXeM## 4 X4007.354 sd 0.0549 normalize_0VXeM## 5 X4011.211 sd 0.0549 normalize_0VXeM## 6 X4015.068 sd 0.0549 normalize_0VXeM## 7 X4018.925 sd 0.0549 normalize_0VXeM## 8 X4022.781 sd 0.0548 normalize_0VXeM## 9 X4026.638 sd 0.0547 normalize_0VXeM## 10 X4030.495 sd 0.0546 normalize_0VXeM## # … with 1,547 more rows
pca_tabela_normalizada <- tidy(dados_receita_normal_pca, 2)pca_tabela_normalizada
## # A tibble: 56,052 × 4## terms value component id ## <chr> <dbl> <chr> <chr> ## 1 X10001.03 0.0257 PC1 pca_lZPx9## 2 X3999.64 0.0216 PC1 pca_lZPx9## 3 X4003.497 0.0216 PC1 pca_lZPx9## 4 X4007.354 0.0217 PC1 pca_lZPx9## 5 X4011.211 0.0217 PC1 pca_lZPx9## 6 X4015.068 0.0218 PC1 pca_lZPx9## 7 X4018.925 0.0218 PC1 pca_lZPx9## 8 X4022.781 0.0218 PC1 pca_lZPx9## 9 X4026.638 0.0218 PC1 pca_lZPx9## 10 X4030.495 0.0219 PC1 pca_lZPx9## # … with 56,042 more rows
## pcs variacao_porcentagem variacao_cumulativa## 1 PC1 9.500236e+01 95.00236## 2 PC2 4.772334e+00 99.77469## 3 PC3 1.379815e-01 99.91267## 4 PC4 5.057695e-02 99.96325## 5 PC5 1.919332e-02 99.98244## 6 PC6 1.076041e-02 99.99320## 7 PC7 4.050682e-03 99.99725## 8 PC8 1.002161e-03 99.99825## 9 PC9 6.999285e-04 99.99895## 10 PC10 3.833044e-04 99.99934## 11 PC11 1.616011e-04 99.99950## 12 PC12 1.414900e-04 99.99964## 13 PC13 1.004364e-04 99.99974## 14 PC14 6.324811e-05 99.99980## 15 PC15 4.144309e-05 99.99985## 16 PC16 3.638183e-05 99.99988## 17 PC17 2.951095e-05 99.99991## 18 PC18 2.492981e-05 99.99994## 19 PC19 2.111392e-05 99.99996## 20 PC20 1.744787e-05 99.99998## 21 PC21 1.303788e-05 99.99999## 22 PC22 1.136185e-05 100.00000## 23 PC23 1.703797e-29 100.00000## 24 PC24 8.279586e-31 100.00000## 25 PC25 8.279586e-31 100.00000## 26 PC26 8.279586e-31 100.00000## 27 PC27 8.279586e-31 100.00000## 28 PC28 8.279586e-31 100.00000## 29 PC29 8.279586e-31 100.00000## 30 PC30 8.279586e-31 100.00000## 31 PC31 8.279586e-31 100.00000## 32 PC32 8.279586e-31 100.00000## 33 PC33 8.279586e-31 100.00000## 34 PC34 8.279586e-31 100.00000## 35 PC35 8.279586e-31 100.00000## 36 PC36 8.279586e-31 100.00000
sdev_pca_normalizada <- dados_receita_normal_pca$steps[[2]]$res$sdevporcent_variacao_normalizada <- sdev_pca_normalizada^2 / sum(sdev_pca_normalizada^2)pca_normalizada_variacao <- data.frame( pcs = unique(pca_tabela_normalizada$component), variacao_porcentagem = porcent_variacao_normalizada*100, variacao_cumulativa = cumsum(porcent_variacao_normalizada*100) )pca_normalizada_variacao
pc1_normal <- filter(pca_normalizada_variacao, pcs == "PC1")pc2_normal <- filter(pca_normalizada_variacao, pcs == "PC2")juice(dados_receita_normal_pca) %>% ggplot(aes(PC1, PC2)) + geom_point(aes(color = SP1), alpha = 0.7, size = 2) + xlab(paste0("PC1 (", round(pc1_normal$variacao_porcentagem, 2), "%)")) + ylab(paste0("PC2 (", round(pc2_normal$variacao_porcentagem, 2), "%)"))
Kuhn, M. e Johnson, K. 2019. Feature Engineering and Selection: A Practical Approach for Predictive Models. CRC Press.
Kuhn, M. 2019. The caret package. Disponível em https://topepo.github.io/caret/index.html.
Kuhn, M. 2019. A Short Introduction to the caret Package. Disponível em https://cran.r-project.org/web/packages/caret/vignettes/caret.html.
Kuhn, Max e Silge, J. 2021. Tidy Modeling with R. Disponível em https://www.tmwr.org/base-r.html.
Perdiz, R. O que é o tidyverse? Disponível em https://www.ricardoperdiz.com/blog/2020-04-tidyverse/
Silge, Julia. Todas suas postagens são úteis. #tidytuesday #tidymodels.
Wickham, H. e Grolemund, J. 2017. R for Data Science. Disponível em https://r4ds.had.co.nz.