Básico Tutoriais de R

Manuseando estrutura de dados em R

2-Manuseando-Estrutura-de-Dados.utf8.md

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.

One Reply to “Manuseando estrutura de dados em R”

  1. Sou a Amanda Da Silva, gostei muito do seu artigo tem
    muito conteúdo de valor parabéns nota 10 gostei muito.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *