Capítulo 3 Acessando e manipulação de dados

3.1 Organização

Assista este conteúdo em Cap 2 - Organização Partes 1 e 2 no PVANet

Como mencionado anteriormente, vector é uma das principais estruturas do R. Um vetor é uma sequência de elementos (1…n) do mesmo tipo organizados tal qual livros em uma prateleira.
No caso abaixo temos um vetor numérico que pode ser integer ou double.

a<-c(25,17,55,3,12,315,10,2,3,11)
a
##  [1]  25  17  55   3  12 315  10   2   3  11
Posição 1 2 3 4 5 6 7 8 9 10
Elementos 25 17 55 3 12 315 10 2 3 11

Um vetor também pode armazernar caracteres. Neste caso eles devem estar entre aspas duplas ("").

b<-c("Z","f", "7","2a","Yes","A","Ab")
b;typeof(b)
## [1] "Z"   "f"   "7"   "2a"  "Yes" "A"   "Ab"
## [1] "character"

Embora tenhamos o número 7 entre os nossos elementos do vetor acima, por estar entre aspas o número 7 não é numéric, mas caractere.
Lembrem-se que um vector é um banco de dados da mesmo tipo Logo, se você colocar um número 7 dentro dele, o R vai automaticamente convertê-lo em caractere independente de estar entre "" ou não.

Posição 1 2 3 4 5 6 7
Elementos “Z” “f” “7” “2a” “Yes” “A” “Ab”

Mesmo que você tenha apenas um único numeral ele será armazenado como vector, vector de comprimento = 1. Então um único número ou um único caractere será um vector.

c<-(1)
c;typeof(c);is.vector(c)
## [1] 1
## [1] "double"
## [1] TRUE
Posição 1
Elemento “1”

Entender a posição de cada elemento dentro de um vector é crucial! Saber a posição correta onde determinado(s) elemento(s) está(estão) facilita em muito nossa limpeza, nosso tratamento e demais passos para uma eficiente manipulação dos dados.

seq(100,50,-1)
##  [1] 100  99  98  97  96  95  94  93  92  91  90  89  88  87  86  85  84  83  82
## [20]  81  80  79  78  77  76  75  74  73  72  71  70  69  68  67  66  65  64  63
## [39]  62  61  60  59  58  57  56  55  54  53  52  51  50

Atenção para os números dentro dos colchetes [1] [17] [33] [49]. Como mencionado em aulas passadas, eles, os colchetes, indicam a posição de determinados elementos dentro de um banco de dados.
Especificamente o [1] informa que o número 100 é o primeiro elemento, [17] informa que o número 84 é o vigésimo elemento, [33] informa que o número 68 é o trigésimo nono elemento, [49] informa que o número 52 é o trigésimo nono elemento.

3.1.1 Usando [ ] - Subscribing ou indexing

3.1.1.1 Vetores

Podemos extrapolar esta ideia de utilização de [] para acessar informações dentros dos objetos que criamos ou importamos.

d<-c("a","b","c","d","e")
d
## [1] "a" "b" "c" "d" "e"
Posição 1 2 3 4 5
Elementos “a” “b” “c” “d” “e”

No vector d temos cada um dos elementos em sua respectiva posição. Para acessar um elemento específico podemos inserir o número refere à sua posição dentro de [].
Por exemplo:

d[1]
## [1] "a"
d[2]
## [1] "b"
d[3]
## [1] "c"
d[4]
## [1] "d"
d[5]
## [1] "e"

Importante saber que [] é muito versátil.

d[-1] # Acessa todos elementos exceto o primeiro
## [1] "b" "c" "d" "e"
d1<-d[3] # Atribuir o(s) elemento(s) de um vetor a outro vetor, ou criar um novo objeto de elementos já de objetos já existentes
d1
## [1] "c"
d[1:3] # Acessar um intervalo de elementos
## [1] "a" "b" "c"
d[3:5]
## [1] "c" "d" "e"
d[c(1,3:5)] # Acessar utilizando combinações
## [1] "a" "c" "d" "e"
d[c(-2,-4)] # Exceto o segundo e quanto elementos
## [1] "a" "c" "e"
d[-3:-5] # Exceto o intervalo entre 3 e 5
## [1] "a" "b"

Vamos dar mais uma olhada na importância do [].

Considere os seguintes vetores.

Posição 1 2 3 4 5 6 7 8 9 10
Elemento 50 34 11 7 24 631 20 4 7 21
Posição 1 2 3 4 5 6 7 8 9 10
Elemento 100 2 56 12 0 65 93 10 244 1

Vamos somar os dois vetores e observe que são adicionados o primeiro elemento com primeiro elemento, segundo elemento com segundo elemento e assim por diante.
Em algumas outras linguagens se você quiser fazer esse procedimento, você vai provavelmente usar um loop. Mas em R você pode simplesmente adicioná-los. Esse é o motivo do R ser linguagem vetorizada. Você pode testar qualquer método matemático (soma, divisão, booleana, lógica).

e<-c(50,34,11,7,24,631,20,4,7,21)
f<-c(100,2,56,12,0,65,93,10,244,1)
e;f
##  [1]  50  34  11   7  24 631  20   4   7  21
##  [1] 100   2  56  12   0  65  93  10 244   1
e+f
##  [1] 150  36  67  19  24 696 113  14 251  22

Neste caso funcionou tudo perfeitamente, pois nossos vetores são do mesmo tamanho.
No entanto, caso tenhamos vetores de tamanho diferentes o R vai fazer um procedimento chamado recycling of vector. O R vai fazer com que os dois vetores se encaixarem no mesmo tamanho caso sejam múltiplos. Basicamente, o R vai copiar os elementos do começo do vetor menor e adicionar ao seu fim até que fiqque do mesmo tamanho do outro vetor para, então, fazer a operação.

Posição 1 2 3 4 5
Elemento 50 34 11 7 24
Posição 1 2 3 4 5 6 7 8 9 10
Elemento 100 2 56 12 0 65 93 10 244 1
h<-c( 50,34,11, 7,24)
i<-c(100, 2,56,12, 0,65,93,10,244,1)
h+i
##  [1] 150  36  67  19  24 115 127  21 251  25
h;i
## [1] 50 34 11  7 24
##  [1] 100   2  56  12   0  65  93  10 244   1
h+i
##  [1] 150  36  67  19  24 115 127  21 251  25

E se não forem múltiplos?
Nesse caso vamos ter uma aviso, em que o R ao fazer o preenchimento dos valores faltantes vai querer saber se está certo o que estamos fazendo e emitindo um warning.

j<-c(50,34,11,7,24,631)
k<-c(100,2,56,12,0,65,93,10,244,1)
j+k
## Warning in j + k: comprimento do objeto maior não é múltiplo do comprimento do
## objeto menor
##  [1] 150  36  67  19  24 696 143  44 255   8

3.1.1.2 Matrizes

Da mesma forma que utilizamos [ ] para acessar elementos específicos em um vetor, estes podem ser utilizados para acessar elementos de matrizes.
Lembrando que as matrizes possuem duas dimensões e que as dimensões são organizadas na sequência de linhas e colunas.

l<-cbind(matrix(14:1, ncol=2),matrix(1:14, ncol=2))
l
##      [,1] [,2] [,3] [,4]
## [1,]   14    7    1    8
## [2,]   13    6    2    9
## [3,]   12    5    3   10
## [4,]   11    4    4   11
## [5,]   10    3    5   12
## [6,]    9    2    6   13
## [7,]    8    1    7   14

As linhas e colunas [linhas, colunas] são numeradas sequencialmente [x...n,y] e [x,y...n].
Podemos desta forma selecionar uma ou várias linhas e colunas de uma só vez. Para isto basta apenas numerar a linhas ou coluna requerida.

l[1,] # Apenas a primeira linhas
## [1] 14  7  1  8
l[,1] # Apenas a primeira coluna
## [1] 14 13 12 11 10  9  8
l[1:3,] # O intervalo de linhas entre 1 a 3
##      [,1] [,2] [,3] [,4]
## [1,]   14    7    1    8
## [2,]   13    6    2    9
## [3,]   12    5    3   10
l[,1:3] # O intervalo de colunas entre 1 e 3
##      [,1] [,2] [,3]
## [1,]   14    7    1
## [2,]   13    6    2
## [3,]   12    5    3
## [4,]   11    4    4
## [5,]   10    3    5
## [6,]    9    2    6
## [7,]    8    1    7
l[-3,] # Exceto a terceira linha
##      [,1] [,2] [,3] [,4]
## [1,]   14    7    1    8
## [2,]   13    6    2    9
## [3,]   11    4    4   11
## [4,]   10    3    5   12
## [5,]    9    2    6   13
## [6,]    8    1    7   14
l[,-3] # Exceto a terceira coluna
##      [,1] [,2] [,3]
## [1,]   14    7    8
## [2,]   13    6    9
## [3,]   12    5   10
## [4,]   11    4   11
## [5,]   10    3   12
## [6,]    9    2   13
## [7,]    8    1   14
l[-1:-3,] # Exceto o intervalo de linhas entre 1 a 3
##      [,1] [,2] [,3] [,4]
## [1,]   11    4    4   11
## [2,]   10    3    5   12
## [3,]    9    2    6   13
## [4,]    8    1    7   14
l[,-1:-3] # Exceto o intervalo de colunas entre 1 e 3
## [1]  8  9 10 11 12 13 14

Podemos também acessar elementos específicos de uma matriz definindo o “endereço” do elemento nas linhas e colunas.

l[2,3] # Acessa apenas o elemento do cruzamento da linha 2 e coluna 3
## [1] 2

Para facilitar a manipulação das matrizes podemos nomear as linhas e colunas. Para isso podemos utilizar as funções colnames() e rownames().

nrow(l) # Retorna o número de linhas
## [1] 7
ncol(l) # Retorna o número de colunas
## [1] 4
dim(l) # Retorna as dimnesões (n° de linhas e colunas)
## [1] 7 4
l
##      [,1] [,2] [,3] [,4]
## [1,]   14    7    1    8
## [2,]   13    6    2    9
## [3,]   12    5    3   10
## [4,]   11    4    4   11
## [5,]   10    3    5   12
## [6,]    9    2    6   13
## [7,]    8    1    7   14
rownames(l)<-letters[1:7] # Atribui 7 letras minúsculas sequenciais de "a" até "g" como nomes das linhas
l
##   [,1] [,2] [,3] [,4]
## a   14    7    1    8
## b   13    6    2    9
## c   12    5    3   10
## d   11    4    4   11
## e   10    3    5   12
## f    9    2    6   13
## g    8    1    7   14
colnames(l)<-LETTERS[1:ncol(l)] # Atribui letras maiúsculas sequenciais obedecendo o número de colunas como nomes das colunas
l
##    A B C  D
## a 14 7 1  8
## b 13 6 2  9
## c 12 5 3 10
## d 11 4 4 11
## e 10 3 5 12
## f  9 2 6 13
## g  8 1 7 14

Agora podemos acessar via nomes das linhas e colunas também.

l["a",] # Apenas a primeira linhas
##  A  B  C  D 
## 14  7  1  8
l[,"A"] # Apenas a primeira coluna
##  a  b  c  d  e  f  g 
## 14 13 12 11 10  9  8
l[letters[1:3],] # O intervalo de linhas entre "a" a "c"
##    A B C  D
## a 14 7 1  8
## b 13 6 2  9
## c 12 5 3 10
l[,LETTERS[1:3]] # O intervalo de colunas entre "A" e "C"
##    A B C
## a 14 7 1
## b 13 6 2
## c 12 5 3
## d 11 4 4
## e 10 3 5
## f  9 2 6
## g  8 1 7
l[c("a","c","d"),] # Seleciona as linhas "a", "c" e "d"
##    A B C  D
## a 14 7 1  8
## c 12 5 3 10
## d 11 4 4 11
l[,c("A","C","D")] # Seleciona as colunas "a", "c" e "d"
##    A C  D
## a 14 1  8
## b 13 2  9
## c 12 3 10
## d 11 4 11
## e 10 5 12
## f  9 6 13
## g  8 7 14

3.1.1.3 Arrays

Sendo muito similares aos vetores e matrizes, os arrays podem ter n dimensões.

m<-1:24
dim(m)<-c(4,3,2)
m
## , , 1
## 
##      [,1] [,2] [,3]
## [1,]    1    5    9
## [2,]    2    6   10
## [3,]    3    7   11
## [4,]    4    8   12
## 
## , , 2
## 
##      [,1] [,2] [,3]
## [1,]   13   17   21
## [2,]   14   18   22
## [3,]   15   19   23
## [4,]   16   20   24
# ou
m<-array(1:24,c(4,3,2))
m
## , , 1
## 
##      [,1] [,2] [,3]
## [1,]    1    5    9
## [2,]    2    6   10
## [3,]    3    7   11
## [4,]    4    8   12
## 
## , , 2
## 
##      [,1] [,2] [,3]
## [1,]   13   17   21
## [2,]   14   18   22
## [3,]   15   19   23
## [4,]   16   20   24
m[1,,] # Retorna as primeiras linhas do array
##      [,1] [,2]
## [1,]    1   13
## [2,]    5   17
## [3,]    9   21
m[,2,] # Retorna as segundas colunas do array
##      [,1] [,2]
## [1,]    5   17
## [2,]    6   18
## [3,]    7   19
## [4,]    8   20
m[1,2,] # Retorna as intersecções entre as primeiras linhas com as segundas colunas
## [1]  5 17
m[1,2,2] # Retorna as intersecções entre a primeira linha com segunda coluna da sugunda camada
## [1] 17

3.1.1.4 Data Frame

Sendo semelhantes às matrizes, os data frames pode serm acessados pelo número das linhas ou colunas.

Equipes<-c("Flamengo",  "Santos",   "Palmeiras",    "Grêmio",   "Athletico Paranaense", "Săo Paulo",    "Internacional",    "Corinthians",  "Fortaleza",    "Goiás",    "Bahia",    "Vasco da Gama",    "Atlético Mineiro", "Fluminense",   "Botafogo", "Ceará",    "Cruzeiro", "CSA",  "Chapecoense",  "Avaí")
Jogos<-c("38",  "38",   "38",   "38",   "38",   "38",   "38",   "38",   "38",   "38",   "38",   "38",   "38",   "38",   "38",   "38",   "38",   "38",   "38",   "38")
Vitórias<-c("28",   "22",   "21",   "19",   "18",   "17",   "16",   "14",   "15",   "15",   "12",   "12",   "13",   "12",   "13",   "10",   "7",    "8",    "7",    "3")
Empates<-c("6", "8",    "11",   "8",    "10",   "12",   "9",    "14",   "8",    "7",    "13",   "13",   "9",    "10",   "4",    "9",    "15",   "8",    "11",   "11")
Derrotas<-c("4",    "8",    "6",    "11",   "10",   "9",    "13",   "10",   "15",   "16",   "13",   "13",   "16",   "16",   "21",   "19",   "16",   "22",   "20",   "24")
Gols.Pró<-c("86",   "60",   "61",   "64",   "51",   "39",   "44",   "42",   "50",   "46",   "44",   "39",   "45",   "38",   "31",   "36",   "27",   "24",   "31",   "18")
Gols.Contra<-c("37",    "33",   "32",   "39",   "32",   "30",   "39",   "34",   "49",   "64",   "43",   "45",   "49",   "46",   "45",   "41",   "46",   "58",   "52",   "62")
Pontos<-c("90", "74",   "74",   "65",   "64",   "63",   "57",   "56",   "53",   "52",   "49",   "49",   "48",   "46",   "43",   "39",   "36",   "32",   "32",   "20")
Saldo.de.Gols<-c("49",  "27",   "29",   "25",   "19",   "9",    "5",    "8",    "1",    "-18",  "1",    "-6",   "-4",   "-8",   "-14",  "-5",   "-19",  "-34",  "-21",  "-44")
Aprov.<-c("79", "65",   "65",   "57",   "56",   "55",   "5",    "49",   "46",   "46",   "43",   "43",   "42",   "4",    "38",   "34",   "32",   "28",   "28",   "18")
Destino<-c("Libertadores",  "Libertadores", "Libertadores", "Libertadores", "Libertadores", "Libertadores", "Libertadores", "Libertadores", "Sulamericana", "Sulamericana", "Sulamericana", "Sulamericana", "Sulamericana", "Sulamericana", "NA",   "NA",   "Rebaixado",    "Rebaixado",    "Rebaixado",    "Rebaixado")
Campeonato.Brasileiro.2019<-as.data.frame(cbind(Equipes,Jogos,Vitórias,Empates,Derrotas,Gols.Pró,Gols.Contra,Pontos,Saldo.de.Gols, Aprov., Destino))
Equipes Jogos Vitórias Empates Derrotas Gols Pró Gols Contra Pontos Saldo de Gols Aprov Destino
Flamengo 38 28 6 4 86 37 90 49 79 Libertadores
Santos 38 22 8 8 60 33 74 27 65 Libertadores
Palmeiras 38 21 11 6 61 32 74 29 65 Libertadores
Grêmio 38 19 8 11 64 39 65 25 57 Libertadores
Athletico Paranaense 38 18 10 10 51 32 64 19 56 Libertadores
Săo Paulo 38 17 12 9 39 30 63 9 55 Libertadores
Internacional 38 16 9 13 44 39 57 5 5 Libertadores
Corinthians 38 14 14 10 42 34 56 8 49 Libertadores
Fortaleza 38 15 8 15 50 49 53 1 46 Sulamericana
Goiás 38 15 7 16 46 64 52 -18 46 Sulamericana
Bahia 38 12 13 13 44 43 49 1 43 Sulamericana
Vasco da Gama 38 12 13 13 39 45 49 -6 43 Sulamericana
Atlético Mineiro 38 13 9 16 45 49 48 -4 42 Sulamericana
Fluminense 38 12 10 16 38 46 46 -8 4 Sulamericana
Botafogo 38 13 4 21 31 45 43 -14 38 NA
Ceará 38 10 9 19 36 41 39 -5 34 NA
Cruzeiro 38 7 15 16 27 46 36 -19 32 Rebaixado
CSA 38 8 8 22 24 58 32 -34 28 Rebaixado
Chapecoense 38 7 11 20 31 52 32 -21 28 Rebaixado
Avaí 38 3 11 24 18 62 20 -44 18 Rebaixado
Campeonato.Brasileiro.2019[1,] # Retorna a primeira linha do data frame
##    Equipes Jogos Vitórias Empates Derrotas Gols.Pró Gols.Contra Pontos
## 1 Flamengo    38       28       6        4       86          37     90
##   Saldo.de.Gols Aprov.      Destino
## 1            49     79 Libertadores
Campeonato.Brasileiro.2019[,1] # Retorna a primeira coluna do data frame
##  [1] "Flamengo"             "Santos"               "Palmeiras"           
##  [4] "Grêmio"               "Athletico Paranaense" "Săo Paulo"           
##  [7] "Internacional"        "Corinthians"          "Fortaleza"           
## [10] "Goiás"                "Bahia"                "Vasco da Gama"       
## [13] "Atlético Mineiro"     "Fluminense"           "Botafogo"            
## [16] "Ceará"                "Cruzeiro"             "CSA"                 
## [19] "Chapecoense"          "Avaí"

Todas as outras combinações utilizadas nas matrizes podem ser utilizadas aqui nos data frames.
No entanto, os data frames possuem uma outra “vantagem” sobre as matrizes. Além de armazenar elementos de diferentes tipos (numeric, character, logical e etc), eles também podemser acessados utilizando $.

Campeonato.Brasileiro.2019$Equipes # Retorna os elementos da coluna "Equipes"
##  [1] "Flamengo"             "Santos"               "Palmeiras"           
##  [4] "Grêmio"               "Athletico Paranaense" "Săo Paulo"           
##  [7] "Internacional"        "Corinthians"          "Fortaleza"           
## [10] "Goiás"                "Bahia"                "Vasco da Gama"       
## [13] "Atlético Mineiro"     "Fluminense"           "Botafogo"            
## [16] "Ceará"                "Cruzeiro"             "CSA"                 
## [19] "Chapecoense"          "Avaí"
Campeonato.Brasileiro.2019$Vitórias # Retorna os elementos da coluna "Vitórias"
##  [1] "28" "22" "21" "19" "18" "17" "16" "14" "15" "15" "12" "12" "13" "12" "13"
## [16] "10" "7"  "8"  "7"  "3"
Campeonato.Brasileiro.2019$Gols.Pró # Retorna os elementos da coluna "Gols.Pró"
##  [1] "86" "60" "61" "64" "51" "39" "44" "42" "50" "46" "44" "39" "45" "38" "31"
## [16] "36" "27" "24" "31" "18"
Campeonato.Brasileiro.2019$Saldo.de.Gols # Retorna os elementos da coluna "Saldo.de.Gols"
##  [1] "49"  "27"  "29"  "25"  "19"  "9"   "5"   "8"   "1"   "-18" "1"   "-6" 
## [13] "-4"  "-8"  "-14" "-5"  "-19" "-34" "-21" "-44"
Campeonato.Brasileiro.2019$Destino # Retorna os elementos da coluna "Destino"
##  [1] "Libertadores" "Libertadores" "Libertadores" "Libertadores" "Libertadores"
##  [6] "Libertadores" "Libertadores" "Libertadores" "Sulamericana" "Sulamericana"
## [11] "Sulamericana" "Sulamericana" "Sulamericana" "Sulamericana" "NA"          
## [16] "NA"           "Rebaixado"    "Rebaixado"    "Rebaixado"    "Rebaixado"
Campeonato.Brasileiro.2019$Equipes[2] # Retorna o segundo elemento da coluna "Nome"
## [1] "Santos"
Campeonato.Brasileiro.2019$Vitórias[5] # Retorna o quinto elemento da coluna "Vitórias"
## [1] "18"
Campeonato.Brasileiro.2019$Gols.Pró[3] # Retorna os elementos da coluna "Gols.Pró"
## [1] "61"
Campeonato.Brasileiro.2019$Saldo.de.Gols[1] # Retorna os elementos da coluna "Nivel.deR"
## [1] "49"
Campeonato.Brasileiro.2019$Destino[10] # Retorna os elementos da décima coluna "Destino"
## [1] "Sulamericana"

Outra maneira de acessar informações pode através [].

Campeonato.Brasileiro.2019[Campeonato.Brasileiro.2019$Equipes=="Flamengo",] # Retorna apenas as informações da coluna "Equipes" que atendem o critério "Flamengo"
##    Equipes Jogos Vitórias Empates Derrotas Gols.Pró Gols.Contra Pontos
## 1 Flamengo    38       28       6        4       86          37     90
##   Saldo.de.Gols Aprov.      Destino
## 1            49     79 Libertadores
split(Campeonato.Brasileiro.2019,Destino) # Retorna apenas as informações da coluna "Destino" 
## $Libertadores
##                Equipes Jogos Vitórias Empates Derrotas Gols.Pró Gols.Contra
## 1             Flamengo    38       28       6        4       86          37
## 2               Santos    38       22       8        8       60          33
## 3            Palmeiras    38       21      11        6       61          32
## 4               Grêmio    38       19       8       11       64          39
## 5 Athletico Paranaense    38       18      10       10       51          32
## 6            Săo Paulo    38       17      12        9       39          30
## 7        Internacional    38       16       9       13       44          39
## 8          Corinthians    38       14      14       10       42          34
##   Pontos Saldo.de.Gols Aprov.      Destino
## 1     90            49     79 Libertadores
## 2     74            27     65 Libertadores
## 3     74            29     65 Libertadores
## 4     65            25     57 Libertadores
## 5     64            19     56 Libertadores
## 6     63             9     55 Libertadores
## 7     57             5      5 Libertadores
## 8     56             8     49 Libertadores
## 
## $`NA`
##     Equipes Jogos Vitórias Empates Derrotas Gols.Pró Gols.Contra Pontos
## 15 Botafogo    38       13       4       21       31          45     43
## 16    Ceará    38       10       9       19       36          41     39
##    Saldo.de.Gols Aprov. Destino
## 15           -14     38      NA
## 16            -5     34      NA
## 
## $Rebaixado
##        Equipes Jogos Vitórias Empates Derrotas Gols.Pró Gols.Contra Pontos
## 17    Cruzeiro    38        7      15       16       27          46     36
## 18         CSA    38        8       8       22       24          58     32
## 19 Chapecoense    38        7      11       20       31          52     32
## 20        Avaí    38        3      11       24       18          62     20
##    Saldo.de.Gols Aprov.   Destino
## 17           -19     32 Rebaixado
## 18           -34     28 Rebaixado
## 19           -21     28 Rebaixado
## 20           -44     18 Rebaixado
## 
## $Sulamericana
##             Equipes Jogos Vitórias Empates Derrotas Gols.Pró Gols.Contra Pontos
## 9         Fortaleza    38       15       8       15       50          49     53
## 10            Goiás    38       15       7       16       46          64     52
## 11            Bahia    38       12      13       13       44          43     49
## 12    Vasco da Gama    38       12      13       13       39          45     49
## 13 Atlético Mineiro    38       13       9       16       45          49     48
## 14       Fluminense    38       12      10       16       38          46     46
##    Saldo.de.Gols Aprov.      Destino
## 9              1     46 Sulamericana
## 10           -18     46 Sulamericana
## 11             1     43 Sulamericana
## 12            -6     43 Sulamericana
## 13            -4     42 Sulamericana
## 14            -8      4 Sulamericana

Vou criar alguns verores aleatórios.

gr1 <- rep(letters[1:4],each=5)
gr1
##  [1] "a" "a" "a" "a" "a" "b" "b" "b" "b" "b" "c" "c" "c" "c" "c" "d" "d" "d" "d"
## [20] "d"
gr2 <- c(rep(1:2,each=5),rep(2:3,each=5))
gr2
##  [1] 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3
fc1 <- factor(rep(letters[1:4],each=5))
fc1
##  [1] a a a a a b b b b b c c c c c d d d d d
## Levels: a b c d
fc2 <- factor(c(rep(1:2,each=5),rep(2:3,each=5)))
fc2
##  [1] 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3
## Levels: 1 2 3
split(Campeonato.Brasileiro.2019,f=(gr1)) # Divide o Campeonato.Brasileiro.2019 de acordo com os vetores informados 
## $a
##                Equipes Jogos Vitórias Empates Derrotas Gols.Pró Gols.Contra
## 1             Flamengo    38       28       6        4       86          37
## 2               Santos    38       22       8        8       60          33
## 3            Palmeiras    38       21      11        6       61          32
## 4               Grêmio    38       19       8       11       64          39
## 5 Athletico Paranaense    38       18      10       10       51          32
##   Pontos Saldo.de.Gols Aprov.      Destino
## 1     90            49     79 Libertadores
## 2     74            27     65 Libertadores
## 3     74            29     65 Libertadores
## 4     65            25     57 Libertadores
## 5     64            19     56 Libertadores
## 
## $b
##          Equipes Jogos Vitórias Empates Derrotas Gols.Pró Gols.Contra Pontos
## 6      Săo Paulo    38       17      12        9       39          30     63
## 7  Internacional    38       16       9       13       44          39     57
## 8    Corinthians    38       14      14       10       42          34     56
## 9      Fortaleza    38       15       8       15       50          49     53
## 10         Goiás    38       15       7       16       46          64     52
##    Saldo.de.Gols Aprov.      Destino
## 6              9     55 Libertadores
## 7              5      5 Libertadores
## 8              8     49 Libertadores
## 9              1     46 Sulamericana
## 10           -18     46 Sulamericana
## 
## $c
##             Equipes Jogos Vitórias Empates Derrotas Gols.Pró Gols.Contra Pontos
## 11            Bahia    38       12      13       13       44          43     49
## 12    Vasco da Gama    38       12      13       13       39          45     49
## 13 Atlético Mineiro    38       13       9       16       45          49     48
## 14       Fluminense    38       12      10       16       38          46     46
## 15         Botafogo    38       13       4       21       31          45     43
##    Saldo.de.Gols Aprov.      Destino
## 11             1     43 Sulamericana
## 12            -6     43 Sulamericana
## 13            -4     42 Sulamericana
## 14            -8      4 Sulamericana
## 15           -14     38           NA
## 
## $d
##        Equipes Jogos Vitórias Empates Derrotas Gols.Pró Gols.Contra Pontos
## 16       Ceará    38       10       9       19       36          41     39
## 17    Cruzeiro    38        7      15       16       27          46     36
## 18         CSA    38        8       8       22       24          58     32
## 19 Chapecoense    38        7      11       20       31          52     32
## 20        Avaí    38        3      11       24       18          62     20
##    Saldo.de.Gols Aprov.   Destino
## 16            -5     34        NA
## 17           -19     32 Rebaixado
## 18           -34     28 Rebaixado
## 19           -21     28 Rebaixado
## 20           -44     18 Rebaixado
split(Campeonato.Brasileiro.2019,f=(gr2)) # Divide o Campeonato.Brasileiro.2019 de acordo com os vetores informados 
## $`1`
##                Equipes Jogos Vitórias Empates Derrotas Gols.Pró Gols.Contra
## 1             Flamengo    38       28       6        4       86          37
## 2               Santos    38       22       8        8       60          33
## 3            Palmeiras    38       21      11        6       61          32
## 4               Grêmio    38       19       8       11       64          39
## 5 Athletico Paranaense    38       18      10       10       51          32
##   Pontos Saldo.de.Gols Aprov.      Destino
## 1     90            49     79 Libertadores
## 2     74            27     65 Libertadores
## 3     74            29     65 Libertadores
## 4     65            25     57 Libertadores
## 5     64            19     56 Libertadores
## 
## $`2`
##             Equipes Jogos Vitórias Empates Derrotas Gols.Pró Gols.Contra Pontos
## 6         Săo Paulo    38       17      12        9       39          30     63
## 7     Internacional    38       16       9       13       44          39     57
## 8       Corinthians    38       14      14       10       42          34     56
## 9         Fortaleza    38       15       8       15       50          49     53
## 10            Goiás    38       15       7       16       46          64     52
## 11            Bahia    38       12      13       13       44          43     49
## 12    Vasco da Gama    38       12      13       13       39          45     49
## 13 Atlético Mineiro    38       13       9       16       45          49     48
## 14       Fluminense    38       12      10       16       38          46     46
## 15         Botafogo    38       13       4       21       31          45     43
##    Saldo.de.Gols Aprov.      Destino
## 6              9     55 Libertadores
## 7              5      5 Libertadores
## 8              8     49 Libertadores
## 9              1     46 Sulamericana
## 10           -18     46 Sulamericana
## 11             1     43 Sulamericana
## 12            -6     43 Sulamericana
## 13            -4     42 Sulamericana
## 14            -8      4 Sulamericana
## 15           -14     38           NA
## 
## $`3`
##        Equipes Jogos Vitórias Empates Derrotas Gols.Pró Gols.Contra Pontos
## 16       Ceará    38       10       9       19       36          41     39
## 17    Cruzeiro    38        7      15       16       27          46     36
## 18         CSA    38        8       8       22       24          58     32
## 19 Chapecoense    38        7      11       20       31          52     32
## 20        Avaí    38        3      11       24       18          62     20
##    Saldo.de.Gols Aprov.   Destino
## 16            -5     34        NA
## 17           -19     32 Rebaixado
## 18           -34     28 Rebaixado
## 19           -21     28 Rebaixado
## 20           -44     18 Rebaixado
split(Campeonato.Brasileiro.2019,f=list(gr1,gr2), drop = TRUE, sep = ": ") # Divide o Campeonato.Brasileiro.2019 de acordo com as listas informadas 
## $`a: 1`
##                Equipes Jogos Vitórias Empates Derrotas Gols.Pró Gols.Contra
## 1             Flamengo    38       28       6        4       86          37
## 2               Santos    38       22       8        8       60          33
## 3            Palmeiras    38       21      11        6       61          32
## 4               Grêmio    38       19       8       11       64          39
## 5 Athletico Paranaense    38       18      10       10       51          32
##   Pontos Saldo.de.Gols Aprov.      Destino
## 1     90            49     79 Libertadores
## 2     74            27     65 Libertadores
## 3     74            29     65 Libertadores
## 4     65            25     57 Libertadores
## 5     64            19     56 Libertadores
## 
## $`b: 2`
##          Equipes Jogos Vitórias Empates Derrotas Gols.Pró Gols.Contra Pontos
## 6      Săo Paulo    38       17      12        9       39          30     63
## 7  Internacional    38       16       9       13       44          39     57
## 8    Corinthians    38       14      14       10       42          34     56
## 9      Fortaleza    38       15       8       15       50          49     53
## 10         Goiás    38       15       7       16       46          64     52
##    Saldo.de.Gols Aprov.      Destino
## 6              9     55 Libertadores
## 7              5      5 Libertadores
## 8              8     49 Libertadores
## 9              1     46 Sulamericana
## 10           -18     46 Sulamericana
## 
## $`c: 2`
##             Equipes Jogos Vitórias Empates Derrotas Gols.Pró Gols.Contra Pontos
## 11            Bahia    38       12      13       13       44          43     49
## 12    Vasco da Gama    38       12      13       13       39          45     49
## 13 Atlético Mineiro    38       13       9       16       45          49     48
## 14       Fluminense    38       12      10       16       38          46     46
## 15         Botafogo    38       13       4       21       31          45     43
##    Saldo.de.Gols Aprov.      Destino
## 11             1     43 Sulamericana
## 12            -6     43 Sulamericana
## 13            -4     42 Sulamericana
## 14            -8      4 Sulamericana
## 15           -14     38           NA
## 
## $`d: 3`
##        Equipes Jogos Vitórias Empates Derrotas Gols.Pró Gols.Contra Pontos
## 16       Ceará    38       10       9       19       36          41     39
## 17    Cruzeiro    38        7      15       16       27          46     36
## 18         CSA    38        8       8       22       24          58     32
## 19 Chapecoense    38        7      11       20       31          52     32
## 20        Avaí    38        3      11       24       18          62     20
##    Saldo.de.Gols Aprov.   Destino
## 16            -5     34        NA
## 17           -19     32 Rebaixado
## 18           -34     28 Rebaixado
## 19           -21     28 Rebaixado
## 20           -44     18 Rebaixado

Alterando elementos dentro do data frame.

Campeonato.Brasileiro.2019$Destino # Retorna apenas as informações da coluna "Destino" 
##  [1] "Libertadores" "Libertadores" "Libertadores" "Libertadores" "Libertadores"
##  [6] "Libertadores" "Libertadores" "Libertadores" "Sulamericana" "Sulamericana"
## [11] "Sulamericana" "Sulamericana" "Sulamericana" "Sulamericana" "NA"          
## [16] "NA"           "Rebaixado"    "Rebaixado"    "Rebaixado"    "Rebaixado"
Campeonato.Brasileiro.2019$Destino[Campeonato.Brasileiro.2019$Destino=="NA"]<-"Lugar Algum" 
# Substitui "Libertadores" na coluna "Destino" por "Liberta".

Veja como ficou com a informação alterada.

Equipes Jogos Vitórias Empates Derrotas Gols Pró Gols Contra Pontos Saldo de Gols Aprov Destino
Flamengo 38 28 6 4 86 37 90 49 79 Libertadores
Santos 38 22 8 8 60 33 74 27 65 Libertadores
Palmeiras 38 21 11 6 61 32 74 29 65 Libertadores
Grêmio 38 19 8 11 64 39 65 25 57 Libertadores
Athletico Paranaense 38 18 10 10 51 32 64 19 56 Libertadores
Săo Paulo 38 17 12 9 39 30 63 9 55 Libertadores
Internacional 38 16 9 13 44 39 57 5 5 Libertadores
Corinthians 38 14 14 10 42 34 56 8 49 Libertadores
Fortaleza 38 15 8 15 50 49 53 1 46 Sulamericana
Goiás 38 15 7 16 46 64 52 -18 46 Sulamericana
Bahia 38 12 13 13 44 43 49 1 43 Sulamericana
Vasco da Gama 38 12 13 13 39 45 49 -6 43 Sulamericana
Atlético Mineiro 38 13 9 16 45 49 48 -4 42 Sulamericana
Fluminense 38 12 10 16 38 46 46 -8 4 Sulamericana
Botafogo 38 13 4 21 31 45 43 -14 38 Lugar Algum
Ceará 38 10 9 19 36 41 39 -5 34 Lugar Algum
Cruzeiro 38 7 15 16 27 46 36 -19 32 Rebaixado
CSA 38 8 8 22 24 58 32 -34 28 Rebaixado
Chapecoense 38 7 11 20 31 52 32 -21 28 Rebaixado
Avaí 38 3 11 24 18 62 20 -44 18 Rebaixado

Vamos expurgar remover o Vasco da Gama da nossa lista.

Campeonato.Brasileiro.2019$Equipes # Retorna apenas as informações da coluna "Equipes" 
##  [1] "Flamengo"             "Santos"               "Palmeiras"           
##  [4] "Grêmio"               "Athletico Paranaense" "Săo Paulo"           
##  [7] "Internacional"        "Corinthians"          "Fortaleza"           
## [10] "Goiás"                "Bahia"                "Vasco da Gama"       
## [13] "Atlético Mineiro"     "Fluminense"           "Botafogo"            
## [16] "Ceará"                "Cruzeiro"             "CSA"                 
## [19] "Chapecoense"          "Avaí"
Campeonato.Brasileiro.2019.SV<-Campeonato.Brasileiro.2019[Campeonato.Brasileiro.2019$Equipes!="Vasco da Gama",] #Seleciona tudo exceto aquilo que for de "Vasco da Gama"
Equipes Jogos Vitórias Empates Derrotas Gols Pró Gols Contra Pontos Saldo de Gols Aprov Destino
1 Flamengo 38 28 6 4 86 37 90 49 79 Libertadores
2 Santos 38 22 8 8 60 33 74 27 65 Libertadores
3 Palmeiras 38 21 11 6 61 32 74 29 65 Libertadores
4 Grêmio 38 19 8 11 64 39 65 25 57 Libertadores
5 Athletico Paranaense 38 18 10 10 51 32 64 19 56 Libertadores
6 Săo Paulo 38 17 12 9 39 30 63 9 55 Libertadores
7 Internacional 38 16 9 13 44 39 57 5 5 Libertadores
8 Corinthians 38 14 14 10 42 34 56 8 49 Libertadores
9 Fortaleza 38 15 8 15 50 49 53 1 46 Sulamericana
10 Goiás 38 15 7 16 46 64 52 -18 46 Sulamericana
11 Bahia 38 12 13 13 44 43 49 1 43 Sulamericana
13 Atlético Mineiro 38 13 9 16 45 49 48 -4 42 Sulamericana
14 Fluminense 38 12 10 16 38 46 46 -8 4 Sulamericana
15 Botafogo 38 13 4 21 31 45 43 -14 38 Lugar Algum
16 Ceará 38 10 9 19 36 41 39 -5 34 Lugar Algum
17 Cruzeiro 38 7 15 16 27 46 36 -19 32 Rebaixado
18 CSA 38 8 8 22 24 58 32 -34 28 Rebaixado
19 Chapecoense 38 7 11 20 31 52 32 -21 28 Rebaixado
20 Avaí 38 3 11 24 18 62 20 -44 18 Rebaixado

Atendendo a pedidos, vamos continuar brevemente com manipulação de dados em data.frame.

As funções grep, grepl, regexpr, gregexpr e regexec busca por elementos de um objeto que coincidem com um argumento padrão.

3.1.2 grep()

grep("Lugar Algum", Campeonato.Brasileiro.2019$Destino) # retorna as posições de tudo no vetor Campeonato.Brasileiro.2019$Destino que coincide com Lugar Algum 
## [1] 15 16

Durante a aula gravada eu me enrolei um pouco na demonstração abaixo. Acontece que Libertadores estava escrito errado, estava escrito Libetadores (sem o r).

grep("Libertadores|Lugar Algum", Campeonato.Brasileiro.2019$Destino) # retorna as posições de tudo no vetor Campeonato.Brasileiro.2019$Destino que coincide com Libetadores ou Lugar Algum
##  [1]  1  2  3  4  5  6  7  8 15 16
grep("Lugar Algum", Campeonato.Brasileiro.2019$Destino) # retorna as posições de tudo no vetor Campeonato.Brasileiro.2019$Destino que coincide com Lugar Algum 
## [1] 15 16
Campeonato.Brasileiro.2019$Destino[15]<-"lugar algum" #Substitui a 15ª posição por lugar algum"

Execute o comando grepanterior novamente e veja as diferenças.

Equipes Jogos Vitórias Empates Derrotas Gols Pró Gols Contra Pontos Saldo de Gols Aprov Destino
Flamengo 38 28 6 4 86 37 90 49 79 Libertadores
Santos 38 22 8 8 60 33 74 27 65 Libertadores
Palmeiras 38 21 11 6 61 32 74 29 65 Libertadores
Grêmio 38 19 8 11 64 39 65 25 57 Libertadores
Athletico Paranaense 38 18 10 10 51 32 64 19 56 Libertadores
Săo Paulo 38 17 12 9 39 30 63 9 55 Libertadores
Internacional 38 16 9 13 44 39 57 5 5 Libertadores
Corinthians 38 14 14 10 42 34 56 8 49 Libertadores
Fortaleza 38 15 8 15 50 49 53 1 46 Sulamericana
Goiás 38 15 7 16 46 64 52 -18 46 Sulamericana
Bahia 38 12 13 13 44 43 49 1 43 Sulamericana
Vasco da Gama 38 12 13 13 39 45 49 -6 43 Sulamericana
Atlético Mineiro 38 13 9 16 45 49 48 -4 42 Sulamericana
Fluminense 38 12 10 16 38 46 46 -8 4 Sulamericana
Botafogo 38 13 4 21 31 45 43 -14 38 lugar algum
Ceará 38 10 9 19 36 41 39 -5 34 Lugar Algum
Cruzeiro 38 7 15 16 27 46 36 -19 32 Rebaixado
CSA 38 8 8 22 24 58 32 -34 28 Rebaixado
Chapecoense 38 7 11 20 31 52 32 -21 28 Rebaixado
Avaí 38 3 11 24 18 62 20 -44 18 Rebaixado
grep("[L l]ugar [A a]lgum",Campeonato.Brasileiro.2019$Destino) # retorna as posições de tudo no vetor Campeonato.Brasileiro.2019$Destino que coincide com Lugar/lugar ou Algum/algum 
## [1] 15 16
str(grep("lugar algum", Campeonato.Brasileiro.2019$Destino))
##  int 15
str(grep("Lugar Algum", Campeonato.Brasileiro.2019$Destino)) # mostra a estrutura de um objeto
##  int 16
setdiff(grep("lugar algum", Campeonato.Brasileiro.2019$Destino), 
        grep("Lugar Algum", Campeonato.Brasileiro.2019$Destino)) #Identifica a difença entre X e Y
## [1] 15
setdiff(grep("Lugar Algum", Campeonato.Brasileiro.2019$Destino), 
        grep("lugar algum", Campeonato.Brasileiro.2019$Destino)) 
## [1] 16
library(purrr)
## 
## Attaching package: 'purrr'
## The following object is masked from 'package:magrittr':
## 
##     set_names
suits <- c('spades', 'clubs', 'diamonds', 'hearts')

suit <- unlist(map(suits, rep, 13))

head(suit)
## [1] "spades" "spades" "spades" "spades" "spades" "spades"
faces <- c('king', 'queen', 'jack', 'ten', 'nine', 'eight', 'seven', 'six', 'five', 'four', 'three', 'two', 'ace')

face <- rep(faces, 4)

head(face)
## [1] "king"  "queen" "jack"  "ten"   "nine"  "eight"
value <- rep(13:1, 4)

head(value)
## [1] 13 12 11 10  9  8
deck <- data.frame(face, suit, value)

head(deck)
##    face   suit value
## 1  king spades    13
## 2 queen spades    12
## 3  jack spades    11
## 4   ten spades    10
## 5  nine spades     9
## 6 eight spades     8
A <- subset(deck, suit == "hearts")
A
##     face   suit value
## 40  king hearts    13
## 41 queen hearts    12
## 42  jack hearts    11
## 43   ten hearts    10
## 44  nine hearts     9
## 45 eight hearts     8
## 46 seven hearts     7
## 47   six hearts     6
## 48  five hearts     5
## 49  four hearts     4
## 50 three hearts     3
## 51   two hearts     2
## 52   ace hearts     1
B <- subset(deck, face == "ace" )
B
##    face     suit value
## 13  ace   spades     1
## 26  ace    clubs     1
## 39  ace diamonds     1
## 52  ace   hearts     1
setdiff(B, A) #Identifica a difença entre X e Y
## $face
## [1] "ace" "ace" "ace" "ace"
## 
## $suit
## [1] "spades"   "clubs"    "diamonds" "hearts"  
## 
## $value
## [1] 1 1 1 1
Campeonato.Brasileiro.2019$Equipes[1]
## [1] "Flamengo"
grep("Flamengo", Campeonato.Brasileiro.2019$Equipes, value = TRUE)
## [1] "Flamengo"

3.1.3 grepl()

grepl("Flamengo", Campeonato.Brasileiro.2019$Equipes) # Retorna valores lógicos de acordo com o critério estabelecido
##  [1]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

3.1.4 sub() e gsub()

sub("Fla", "fla", Campeonato.Brasileiro.2019$Equipes) #Substitui Fla por fla naquilo que começa com Fla
##  [1] "flamengo"             "Santos"               "Palmeiras"           
##  [4] "Grêmio"               "Athletico Paranaense" "Săo Paulo"           
##  [7] "Internacional"        "Corinthians"          "Fortaleza"           
## [10] "Goiás"                "Bahia"                "Vasco da Gama"       
## [13] "Atlético Mineiro"     "Fluminense"           "Botafogo"            
## [16] "Ceará"                "Cruzeiro"             "CSA"                 
## [19] "Chapecoense"          "Avaí"
gsub("Atlé|Athle", "Atle", Campeonato.Brasileiro.2019$Equipes) #Substitui Atlé ou Athle por Atlé naquilo que contém com Atlé ou Athle
##  [1] "Flamengo"            "Santos"              "Palmeiras"          
##  [4] "Grêmio"              "Atletico Paranaense" "Săo Paulo"          
##  [7] "Internacional"       "Corinthians"         "Fortaleza"          
## [10] "Goiás"               "Bahia"               "Vasco da Gama"      
## [13] "Atletico Mineiro"    "Fluminense"          "Botafogo"           
## [16] "Ceará"               "Cruzeiro"            "CSA"                
## [19] "Chapecoense"         "Avaí"

Alguns elementos especiais podem ser encontrados no R como: Infinito positivo ou negativo (-Inf e Inf), elementos “não número” (NaN - Not a Number) e valores ausentes (NA, Not Available).

3/0
## [1] Inf
-3/0
## [1] -Inf
x<-Inf;x
## [1] Inf
y<-(-Inf);y
## [1] -Inf
0/0
## [1] NaN
Inf-Inf
## [1] NaN
Campeonato.Brasileiro.2019[Campeonato.Brasileiro.2019<=10]<-NA
Equipes Jogos Vitórias Empates Derrotas Gols Pró Gols Contra Pontos Saldo de Gols Aprov Destino
Flamengo 38 28 6 4 86 37 90 49 79 Libertadores
Santos 38 22 8 8 60 33 74 27 65 Libertadores
Palmeiras 38 21 11 6 61 32 74 29 65 Libertadores
Grêmio 38 19 8 11 64 39 65 25 57 Libertadores
Athletico Paranaense 38 18 NA NA 51 32 64 19 56 Libertadores
Săo Paulo 38 17 12 9 39 30 63 9 55 Libertadores
Internacional 38 16 9 13 44 39 57 5 5 Libertadores
Corinthians 38 14 14 NA 42 34 56 8 49 Libertadores
Fortaleza 38 15 8 15 50 49 53 NA 46 Sulamericana
Goiás 38 15 7 16 46 64 52 NA 46 Sulamericana
Bahia 38 12 13 13 44 43 49 NA 43 Sulamericana
Vasco da Gama 38 12 13 13 39 45 49 NA 43 Sulamericana
Atlético Mineiro 38 13 9 16 45 49 48 NA 42 Sulamericana
Fluminense 38 12 NA 16 38 46 46 NA 4 Sulamericana
Botafogo 38 13 4 21 31 45 43 NA 38 lugar algum
Ceará 38 NA 9 19 36 41 39 NA 34 Lugar Algum
Cruzeiro 38 7 15 16 27 46 36 NA 32 Rebaixado
CSA 38 8 8 22 24 58 32 NA 28 Rebaixado
Chapecoense 38 7 11 20 31 52 32 NA 28 Rebaixado
Avaí 38 3 11 24 18 62 20 NA 18 Rebaixado
any(is.na(Campeonato.Brasileiro.2019))
## [1] TRUE

Identificando onde estão os valores que atendem critérios desejados.

which(is.na(Campeonato.Brasileiro.2019), arr.ind=TRUE)
##       row col
##  [1,]  16   3
##  [2,]   5   4
##  [3,]  14   4
##  [4,]   5   5
##  [5,]   8   5
##  [6,]   9   9
##  [7,]  10   9
##  [8,]  11   9
##  [9,]  12   9
## [10,]  13   9
## [11,]  14   9
## [12,]  15   9
## [13,]  16   9
## [14,]  17   9
## [15,]  18   9
## [16,]  19   9
## [17,]  20   9
which((Campeonato.Brasileiro.2019<1), arr.ind=TRUE)
##      row col

3.2 Operadores

Assista este conteúdo em Cap 2 - Operadores no PVANet

O R tem vários operadores, tais quais outras linguagens, que nos permitem realizar procedimentos aritiméticos, lógicos ou relacionais.

Os operadores aritméticos atuam em 2 elementos (x e y) e retorna respostas lógicas. Estes elementos, pos sua vez, podem ser de modo (mode()) numéricos ou complexos e também variáveis lógicas.

Símbolo Operação
+ adição
- subtração
* multiplicação
/ divisão
^ potência
%% resto da divisão
%/% divisão inteira
x<-2;y<-3
x+y
## [1] 5
x-y
## [1] -1
x*y
## [1] 6
y/x
## [1] 1.5
y%/%x
## [1] 1
y%%x
## [1] 1
y^x
## [1] 9

Os operadores de comparações atuam em cada elemento de 2 objetos sob comparação (fazendo o recycling se necessário) retornando um objeto do mesmo tamanho.

Símbolo Relação
< menor que
> maior que
<= menor ou igual
>= maior ou igual
== igual
!= diferente
x<-1:3;y<-1:3
x>y
## [1] FALSE FALSE FALSE
x<y
## [1] FALSE FALSE FALSE
x*y
## [1] 1 4 9
y>=x
## [1] TRUE TRUE TRUE
y<=x
## [1] TRUE TRUE TRUE
y==x
## [1] TRUE TRUE TRUE
y!=x
## [1] FALSE FALSE FALSE

Caso queira comparar bancos de dados completos, por inteiro de uma vez só, utilize identical(x,y) e all.equal(x,y).
identicalfaz uma comparação estrita da representação dos objetos e retorna como TRUE ou FALSE.
all.equal compara a “igualdade próxima” e retorna TRUE ou mostra as diferenças.

x<-0.9;y<-0.9
identical(x,y)
## [1] TRUE
identical(0.9, 1.1 - 0.2)
## [1] FALSE
all.equal(x,y)
## [1] TRUE
all.equal(0.9, 1.1 - 0.2, tolerance = 1e-16)
## [1] "Mean relative difference: 1.233581e-16"

Operadores lógicos são utilizados para para testes lógicos entre 1 ou 2 objetos e retorna valores lógicos também.

Símbolo Relação
! Logical NOT
& Logical AND
or Exclusive OR

Lembrando que temos outro operadores $, @, [, [[, :, ?, <-, <<-, =, :: que já começamos a manipular.

Existem dois tipos de pessoas: = & <-

Com o passar do tempo vamos “brincando” com cada operador e, assim, assimilando o que cada uma faz.

3.2.1 Iterações

3.2.1.1 while()

Essa forma de loop é menos comumente usada e potencialmente perigosa, uma vez que ela pode resultar em uma execução descontrolada. Por isso, em muitos casos iterações restritivas são mais adequadas. A função while() requer uma condição testável que continuará a resultar em declarações subsequentes a serem executadas até o resultado do teste dar falso (FALSE).

Estrutura: Começa com a palavra while seguida por parênteses e colchetes while(){} A segunda parte vai dentro de parênteses e diz respeito a uma expressão lógica e a terceira parte, entre colchetes, o corpo do loop. while(abc){xyz} #Se abc for TRUE ele vai executar o resto {xyz}. Depois volta para checar se (abc) continua TRUE ou FALSE para decidir se continua no loop ou parar.

while(condição){
“Código a ser executado”
}

while loop
Fonte: Guru99

Exemplo 1: Teste Ter aula na segunda-feira é bom ou não?

while(FALSE){  
  print("Aula segunda-feira é ótimo!")}
while(TRUE){  
  print("Aula segunda-feira é ótimo!")}

Exemplo 2: Teste Num concurso de beleza Jackson desafiou qualquer um de seus alunos. Cada um recebeu uma nota.

Jackson<-9.5  
Aluno<-6  
while(Aluno<Jackson){  
  print(Jackson)} 

3.2.1.2 for()

É similar ao while(), mas é mais conveniente na maioria dos casos. Iterações restritas (loops) destinam-se a execução de um número fixo de vezes dos comandos usando a função for(). O loop é executado tantas vezes quanto variam os valores de i. Começa com a palavra for seguindo de por parênteses e colchetesfor(){}.

() não especifica funções lógicas como no while, mas especifica as interações do loop. {} são usados para preencher com os comandos do loop

for(i in conjunto_de_valores){
comandos que serão repetidos
}

for loop
Fonte:tutorialspoint

for(i  in 1:5){
  print("Aula segunda-feira é ótimo!")
}
## [1] "Aula segunda-feira é ótimo!"
## [1] "Aula segunda-feira é ótimo!"
## [1] "Aula segunda-feira é ótimo!"
## [1] "Aula segunda-feira é ótimo!"
## [1] "Aula segunda-feira é ótimo!"

Significa que Aula segunda-feira é ótimo! Será mostrada 5 vezes sempre retornando como o objeto criado i.

for(i in  1:5){
  print((i+1)*3)
  }
## [1] 6
## [1] 9
## [1] 12
## [1] 15
## [1] 18

Não importa onde você começa ou o tipo de vetor que é (Caractere, número e etc). Basicamente toda vez que mudar ele vai executar o que estiver dentro do corpo do loop.

3.2.2 Condicionais

3.2.2.1 if, else

A função if() é usado para conduzir uma ou mais declarações contidas dentro de [], fornecendo a condição dentro de ().

Voltando para nosso concurso de beleza, temos um controle um pouco mais inteligente do resultado mostrado.

Jackson<-9.5  
Aluno<-6 
if(Jackson>Aluno){  
  print("Jackson é mais bonito que Aluno!")
  }
## [1] "Jackson é mais bonito que Aluno!"
if(Aluno*2>=Jackson){
  print("Aluno é mais bonito!")
  }
## [1] "Aluno é mais bonito!"

Adaptando a o código acima para fazer a declaração condicional FALSE simplesmente retorna nenhum comando no prompt uma vez que o código não disse como R deveria responder nesse caso.

if(Aluno*2>=Jackson^2){
    print("Aluno é mais bonito!")
  }

Existem 2 métodos de informar ao R como responder em casos onde a declaração de condição é retornada como FALSE: usando o modificador else ou a função ifelse(). Ao contrário de uma função qualquer, else não pode ser usado independentemente, mas apenas como um modificador (adição) ao if(). If no exemplo acima, o resultado é solicitado quando o valor retornado é FALSE, else pode ser adicionado como segue:

if(Aluno*2>=Jackson^2){
    print("A declaração é verdadeira!")
  }else{
    print("A declaração é falsa!")
    }
## [1] "A declaração é falsa!"

Note que else foi escrito na mesma linha que conclui o if() para informar ao R que o teste condicional continua.

Podemos retirar a segunda parte do teste anterior e adicionar uma nova comparação.

Aluno2<-7
if(Aluno2>Jackson){
    print("Aluno1 é mais bonito!")
  }else if(Aluno2>Aluno){
    print("Aluno2 é mais bonito que Aluno e menos bonito que Jackson.")
    }
## [1] "Aluno2 é mais bonito que Aluno e menos bonito que Jackson."

3.2.2.2 ifelse()

A função ifelse() é separada de if() e é formada de uma sintaxe mais simples e concisa. No entanto, ela pode ser usada para gerar o mesmo efeito que nas demonstrações anteriores usando if() com o modificador else.

ifelse(Aluno*2>=Jackson^2, "Aluno é mais bonito!", "Jackson é mais bonito!")
## [1] "Jackson é mais bonito!"

Como mostrado acima, o uso de ifelse() usa a forma: ifelse(teste condicional, resultado se verdadeiro, resultado se falso)

Declarações condicionais também podem ser aninhadas dentro uma outra. Adaptando o exemplo com o argumento else um outro teste é executado se o teste inicial é FALSE, onde o secundário é TRUE.

ifelse(Aluno*2>=Jackson^2, "Aluno é mais bonito!",
       ifelse(Aluno*2>=Jackson^0.5 ,"Agora o Aluno é mais bonito!", "Aluno continua feio!"))
## [1] "Agora o Aluno é mais bonito!"

Se o teste secundário é ajustado de maneira que os resultados em um teste lógico FALSE, o seguinte resultado é retornado.

ifelse(Aluno*2>=Jackson^2, "Aluno é mais bonito!",
       ifelse(Aluno*2>=Jackson^3,"Agora o Aluno é mais bonito!", "Aluno continua feio!"))
## [1] "Aluno continua feio!"

3.3 Dica de leitura

Mello and Peternelli (2013)

Peng (2020b)

Kabacoff (2015)

Venables and Smith (2020)

Neth (2021)

Yamamoto (2020)

Freire (2021b)

Spatial Data Science - Indexing

Indexing into a data structure

r-coder

datamentor - R if…else Statement

3.4 Exercícios

  1. Crie o vetor p que contenham uma sequência de 200 iniciando em 0 aumentando 0.5.
  2. Eleve o vetor p ao cubo criando o vetor o e multiplique por p. Organize p por linhas em uma matriz com 10 colunas .
  3. Crie os elementos x = 10 e y = 25.
  4. Mostre na tela A declaração é verdadeira sob a condição de x ser menor que y.
  5. Mostre 2 maneiras condicionais de executar a declaração na qual mostraria A declaração é correta se x é menor ou igual a y, ou caso contrário mostre A declaração é incorreta se não for o caso.
  6. Atribua z = 50 e construa uma função ifelse() que testa se x é maior que y, mostrando true se a condição é encontrada. Aninhe dentro disso uma segunda condição que mostre uma verdadeira, uma falsa ou ambas falsas caso x seja maior que z.
  7. Use uma iteração restrita para gerar uma sequência de números de 1 até 20.
  8. Use iteração restrita para conduzir o cálculo (i^2)-i, onde i vai de 5 até 10.
  9. Use interação não restrita para gerar uma sequência de inteiros de -10 até -20.

References

———. 2021b. Introdução Ao r. bookdown. http://www.lampada.uerj.br/arquivosdb/_book2/introducaoR.html.
Kabacoff, Robert I. 2015. R in Action. Second. Manning. http://www.worldcat.org/isbn/9781617291388.
Mello, M. P., and L. A. Peternelli. 2013. Conhecendo o r: Uma Visão Mais Que Estatística. First. Editora UFV.
Neth, H. 2021. Data Science for Psychologists. bookdown. https://bookdown.org/hneth/ds4psy/.
———. 2020b. R Programming for Data Science. bookdown. https://bookdown.org/rdpeng/rprogdatascience/.
Venables, W. N., and D. M. Smith. 2020. An Introduction to r. bookdown. https://colinfay.me/intro-to-r/.
Yamamoto, J. K. 2020. Estatística, Análise e Interpolação de Dados Geoespaciais. 1st ed. São Paulo: Gráfica Paulos.