Estrutura de Dados
Como discutido anteriormente (caso não tenha visto o tutorial anterior clique aqui) uma Estrutura de Dados armazena um conjunto de variáveis. Nesse tutorial veremos alguns comandos úteis para manusear as variáveis contidas nessas estruturas. O manuseio desses objetos refere-se a: como acessar as variáveis? como removê-las? como adionar novas?
Matrizes e Data Frames
Os exemplos a seguir serão realizados utilizando um data frame. No entanto, eles são equivalentes para o caso de matrizes. Vejamos alguns comandos abaixo:
v1<-c("A", "B", "C", "D", "E")
v2<-c(10, 22.1, 5, 12, 40)
df<-data.frame("C1"=v1, "C2"=v2)
O código anterior cria dois vetores. O primeiro com variáveis do tipo fator e o segundo com variáveis numéricas, e então os une em um data frame nomeando as colunas com C1 e C2. Vamos agora ver algumas formas de manuseio desse objeto.
class(df) ## mostra a classe do objeto
## [1] "data.frame"
colnames(df) ## mostra o nome das colunas do data frame
## [1] "C1" "C2"
rownames(df) ## mostra o nome das linhas do data frame
## [1] "1" "2" "3" "4" "5"
attributes(df) ## mostra todos os atributos do objeto de uma vez
## $names
## [1] "C1" "C2"
##
## $class
## [1] "data.frame"
##
## $row.names
## [1] 1 2 3 4 5
df$C1 ## permite acessar apenas as variáveis contidas na primeira coluna (v1)
## [1] A B C D E
## Levels: A B C D E
df$C3 <- c(TRUE, FALSE, TRUE, TRUE, FALSE) ## inseri uma nova coluna (C3) com um vetor de variáveis lógicas
df$C2 <- NULL ## exclui a coluna C2 do objeto
df$C4 <- c("Nome1", "Nome2", "Nome3", "Nome4", "Nome5") ## inseri uma nova coluna com nomes
Utilizando o comando $
é possível acessar os vetores que compõe as colunas do data frame. Agora, para extrair apenas algumas linhas ou colunas, ou realizar filtros baseados em critérios de linha e coluna, podemos utilizar df[nº linhas, nº colunas]
. Assim, por exemplo, o comando df[1:2,1:2]
seleciona apenas as duas primeiras linhas e as duas primeiras colunas do data frame. Vejamos:
df[1:2, 1:2] ## selecionaod as 2 primeiras linhas e colunas
## C1 C3
## 1 A TRUE
## 2 B FALSE
df[,2] ## selecionando todas as linhas, e apenas a segunda coluna
## [1] TRUE FALSE TRUE TRUE FALSE
df[df$C3==TRUE,] ## selecionando todas as linhas cuja coluna C3 seja TRUE
## C1 C3 C4
## 1 A TRUE Nome1
## 3 C TRUE Nome3
## 4 D TRUE Nome4
df$C5<-ifelse(df$C3==FALSE, "Comentario", NA) ## Adiciona uma nova coluna escrita "Comentário" para os registros que a coluna C3 é igual a FALSE
df[!is.na(df$C5),] ## filtra apenas os registros cuja coluna C5 não são NA
## C1 C3 C4 C5
## 2 B FALSE Nome2 Comentario
## 5 E FALSE Nome5 Comentario
Filtros utilizando os operadores <
, <=
, >
, >=
, !=
são válidos também.
Tibbles
As tibbles são uma espécie particular de data frame. Ambos armazenam os dados em duas dimensões (linhas e colunas) em que cada variável/coluna possui uma tipagem específica. As tibbles, entretanto, possuem algumas facilidades para o analista de dados.
require(installr) ## Utilize o comando install.packages("installr") caso nunda tenha utilizado esse pacote
require2("tidyr")
require2("tibble")
tib<-as_tibble(df) ## Converte o data frame anterior em uma tibble
tib
## # A tibble: 5 x 4
## C1 C3 C4 C5
## <fct> <lgl> <chr> <chr>
## 1 A TRUE Nome1 <NA>
## 2 B FALSE Nome2 Comentario
## 3 C TRUE Nome3 <NA>
## 4 D TRUE Nome4 <NA>
## 5 E FALSE Nome5 Comentario
A exibição de tibbles contempla, por padrão, apenas 10 linhas, e o número de colunas exibido é definido de modo a não transpassar a largura disponível no console. A tipagem dos dados é apresentada logo abaixo do nome da coluna. Comandos de extração de atribustos (classe, nome das colunas, etc) são igualmente aplicáveis, assim como nos data frames.
tib$C2<-c(10, 22.1, 5, 12, 40) ## Adicionando uma nova coluna a tib da mesma forma que um data frame
tib
## # A tibble: 5 x 5
## C1 C3 C4 C5 C2
## <fct> <lgl> <chr> <chr> <dbl>
## 1 A TRUE Nome1 <NA> 10
## 2 B FALSE Nome2 Comentario 22.1
## 3 C TRUE Nome3 <NA> 5
## 4 D TRUE Nome4 <NA> 12
## 5 E FALSE Nome5 Comentario 40
A filtragem, manuseio e adicão de dados dos tibbles baseia-se nos mesmos operadores apresentados anteriormente, para o caso dos data frames. Entretanto, o uso do operador pipe %>%
para manuseio das tibbles tornou-se o mais usual devido ao uso concomitante dos ferramentais do pacote tidyr
e dplyr
(que será assunto de tutorial futuro).
Esse operador nos permite criar uma estrutura sequencial nas operações executadas em um objeto. Nesse caso, utilizamos o .
para indicar qual a posição do objeto manuseado na operação executada. Vale ressaltar que qualquer objeto no ambiente do R pode ser operado utilizando o pipe e não apenas as tibbles. Vamos ver como esse operador adapta as operações de manuseio observadas anteriormente nos data frames.
tib<-tib %>% add_column(C6=.$C2+1, C7=paste(.$C4,.$C1), C8=1) ## Outra forma de adicionar uma coluna
tib %>% .[1:2, 1:2] ## selecionaod as 2 primeiras linhas e colunas
## # A tibble: 2 x 2
## C1 C3
## <fct> <lgl>
## 1 A TRUE
## 2 B FALSE
tib %>% .[,2] ## selecionando todas as linhas, e apenas a segunda coluna
## # A tibble: 5 x 1
## C3
## <lgl>
## 1 TRUE
## 2 FALSE
## 3 TRUE
## 4 TRUE
## 5 FALSE
tib %>% .[.$C3==TRUE,] ## selecionando todas as linhas cuja coluna C3 seja TRUE
## # A tibble: 3 x 8
## C1 C3 C4 C5 C2 C6 C7 C8
## <fct> <lgl> <chr> <chr> <dbl> <dbl> <chr> <dbl>
## 1 A TRUE Nome1 <NA> 10 11 Nome1 A 1
## 2 C TRUE Nome3 <NA> 5 6 Nome3 C 1
## 3 D TRUE Nome4 <NA> 12 13 Nome4 D 1
tib %>% .[!is.na(.$C5),] ## filtra apenas os registros cuja coluna C5 não são NA
## # A tibble: 2 x 8
## C1 C3 C4 C5 C2 C6 C7 C8
## <fct> <lgl> <chr> <chr> <dbl> <dbl> <chr> <dbl>
## 1 B FALSE Nome2 Comentario 22.1 23.1 Nome2 B 1
## 2 E FALSE Nome5 Comentario 40 41 Nome5 E 1
tib %>% .[.$C3==TRUE & .$C6>10,] ## selecionando todas as linhas cuja coluna C3 seja TRUE e C6 maior que 10
## # A tibble: 2 x 8
## C1 C3 C4 C5 C2 C6 C7 C8
## <fct> <lgl> <chr> <chr> <dbl> <dbl> <chr> <dbl>
## 1 A TRUE Nome1 <NA> 10 11 Nome1 A 1
## 2 D TRUE Nome4 <NA> 12 13 Nome4 D 1
## É possível aplicar funções utilizando essa mesma lógica
tib %>% t() %>% .[1:2,] ## transpõe a tibble e extrai as duas primeiras linhas
## [,1] [,2] [,3] [,4] [,5]
## C1 "A" "B" "C" "D" "E"
## C3 "TRUE" "FALSE" "TRUE" "TRUE" "FALSE"
A adição de colunas calculadas e, de colunas cujo valor é constante, fica facilitado pela estrutura acima. Perceba que automaticamente o valor 1, da coluna C8, é replicado para todas as linhas da tabela e que é possível referenciar diretamente as colunas C1, C2 e C4 para construir as colunas C6 e C7.
A utilização do pipe %>%
organiza o código e o torna mais lógico para aquele que o lê.
Vetores
O manuseio dos vetores pode ser feito com comandos semelhantes ao das matrizes e data frames. Segue:
v1<-c(10,20,30,40,50)
v2<-c(60,80,90)
v <-c(v1,v2) ## cria um novo vetor a partir da união dos dois anteriores
v*2 ## multiplica todos os elementos do vetor v por 2
## [1] 20 40 60 80 100 120 160 180
v[1:3] ## seleciona apenas os 3 primeiros elementos do vetor
## [1] 10 20 30
v[v<50] ## seleciona apenas os elementos do vetor cujo valor é inferior a 50
## [1] 10 20 30 40
v[v>=20 & v<=70] ## seleciona apenas os elementos do vetor cujo valor é superior a 20 e inferior a 70
## [1] 20 30 40 50 60
v[v<=20 | v>=70] ## seleciona apenas os elementos do vetor cujo valor é inferior a 20 ou superior a 70
## [1] 10 20 80 90
Porém, e se quisermos acessar um único elemento de um vetor contido em um data frame? É possível realizar esse procedimento simplesmente operando, de forma sequencial, tudo o que foi apresentado. Por exemplo, para tomar o segundo elemento da primeira coluna do data frame df
basta executar o código abaixo:
df[,1][2] ## o primeiro "1" após a vírgula toma a primeira coluna do data frame. O [2] toma o segundo elemento do vetor resultante.
## [1] B
## Levels: A B C D E
Desafio: tente realizar essa mesma operação utilizando o pipe %>%
. Se conseguiu (ou se quiser a resposta) deixe um comentário ao final.
Listas
Por último, iremos abordar o manuseio de listas. Após familiarizar-se com os exemplos anteriores você irá perceber que o manuseio das listas são uma simples extensão do que já foi apresentado. Vamos aos códigos:
l<-list(df, v) ## cria uma lista com o primeiro elemento sendo o data fram df e o segundo o vetor v
names(l)<-c("df","v") ## trocando os nomes dos objetos da lista
l$df ## acessa o objeto "df" dentro da lista "l"
## C1 C3 C4 C5
## 1 A TRUE Nome1 <NA>
## 2 B FALSE Nome2 Comentario
## 3 C TRUE Nome3 <NA>
## 4 D TRUE Nome4 <NA>
## 5 E FALSE Nome5 Comentario
l[[1]] ## acessa o objeto "df" dentro da lista "l"
## C1 C3 C4 C5
## 1 A TRUE Nome1 <NA>
## 2 B FALSE Nome2 Comentario
## 3 C TRUE Nome3 <NA>
## 4 D TRUE Nome4 <NA>
## 5 E FALSE Nome5 Comentario
l$df[,2][2] ## acessa o segundo elemento, do vetor referente a coluna 2 do data frame "df" da lista "l"
## [1] FALSE
O operador $
uma opção interessante para manuseio de estruturas de dados no R. No entanto, o uso de []
pode servir como uma abordagem alternativa. Neste caso, a vantagem é que não há necessidade de nomear os objetos. Por exemplo, o comando l[[1]][,2][2]
é equivalente à l$df[,"C3"][2]
. Essa funcionalidade é muito útil principalmente para automatização de rotinas.
Sou a Amanda Da Silva, gostei muito do seu artigo tem
muito conteúdo de valor parabéns nota 10 gostei muito.