4  Manipulação de Vetores, Data Frames e Listas

4.1 Trabalhando com Vetores

Operações vetorizadas

x<-1:5
y<-6:10
x+y               #ocorre a soma dos valores de ambos os vetores
[1]  7  9 11 13 15
x*2               #podemos multiplicar um vetor por um numero
[1]  2  4  6  8 10
x^2
[1]  1  4  9 16 25
z<-c(x,y)
z+x
 [1]  2  4  6  8 10  7  9 11 13 15
w<-1:3
w+x
[1] 2 4 6 5 7
l<-c(T, T, F, T, F, F)
l/2
[1] 0.5 0.5 0.0 0.5 0.0 0.0

Para acessar vetores, usamos [ ]

letter <- c("x", "y", "z", "w", "j")
letter[2]               #acessa o segundo elemento do vetor
[1] "y"
letter[2:4]             #podemos usar sequencia de valores
[1] "y" "z" "w"
letter[c(1, 4)]         #usamos a funcao c() para valores nao contiguos
[1] "x" "w"
letter[-2]              #usamos numeros negativos para excluir um ou mais valores
[1] "x" "z" "w" "j"
letter[c(-2, -5)]
[1] "x" "z" "w"
idx <- c(1, 4)          #podemos criar indices numericos
letter[idx]
[1] "x" "w"
x<-1:10                 
x[x>7]                  #podemos usar "<", "==", ">=", etc.
[1]  8  9 10
letter[letter>"k"]      #tambem eh possivel para caracteres
[1] "x" "y" "z" "w"
letter[letter<"k"]
[1] "j"
letter=="z"
[1] FALSE FALSE  TRUE FALSE FALSE

Funções para identificar valores extremos

set.seed(1)
s <- sample(-1000:1000, 200)

which.max(s)            #procura a posicao do maior valor
[1] 126
max(s)                  #imprime o maior valor 
[1] 997
range(s)
[1] -982  997
s>0                     #cria um vetor logico
  [1]  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE FALSE
 [13]  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE FALSE
 [25] FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE
 [37] FALSE  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE FALSE FALSE FALSE
 [49] FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
 [61]  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE
 [73] FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE
 [85]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE
 [97] FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE
[109] FALSE  TRUE  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE
[121] FALSE  TRUE  TRUE  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE FALSE
[133]  TRUE  TRUE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE FALSE
[145]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE
[157] FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE
[169]  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE
[181]  TRUE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE  TRUE  TRUE
[193]  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE
which(s>0)              #cria um vetor com as posicoes que satisfazem o comando
  [1]   1   2   6  10  11  13  14  15  16  18  19  20  21  23  27  28  31  32
 [19]  38  40  42  43  45  50  52  56  61  62  63  66  67  69  70  72  74  75
 [37]  77  78  79  80  81  85  86  87  88  89  90  91  93  94  95  99 100 102
 [55] 105 110 111 113 117 118 119 120 122 123 124 126 130 131 133 134 136 138
 [73] 142 143 145 146 147 148 149 151 153 154 156 161 163 166 168 169 170 177
 [91] 178 181 182 185 187 190 191 192 193 194 198
length(which(s>0))
[1] 101
maior_que_zero <- s[which(s>0)]

Funções de ordenamento

x < -c(3, 8, 2, 1, 5, 9, 7, 7, 3)
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
x      
 [1]  1  2  3  4  5  6  7  8  9 10
sort(x)                 #ordena um vetor
 [1]  1  2  3  4  5  6  7  8  9 10
sort(x, decreasing = T)
 [1] 10  9  8  7  6  5  4  3  2  1
order(x)                #retorna a ordem de cada elemento para torná-lo crescente
 [1]  1  2  3  4  5  6  7  8  9 10
sample(x)               #randomiza
 [1]  3  8  1  2  4  7  6  5  9 10
unique(x)               #elimina as replicatas
 [1]  1  2  3  4  5  6  7  8  9 10
duplicated(x)           #logico
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
length(which(duplicated(x)))
[1] 0
#ou
length(x[duplicated(x)])
[1] 0

4.2 Trabalhando com data.frames

Para acessar data.frames e listas usamos [], [[]] ou $

dt <- data.frame(number=c(1, 2, 3, 4, 5), 
               letter = c("x", "y", "z", "w", "j"),
               logical = c(TRUE, FALSE, FALSE, TRUE, FALSE))

dt[[1]]              # [[ ]] acessa cada coluna por posicao
[1] 1 2 3 4 5
dt[,1]               # [ ] acessa as coordenadas [linha, coluna]
[1] 1 2 3 4 5
dt$number            # $ acessa cada coluna por nome
[1] 1 2 3 4 5

data.frames possuem colnames e rownames

colnames(dt)
[1] "number"  "letter"  "logical"
row.names(dt)
[1] "1" "2" "3" "4" "5"

Podemos alterar colanmes e rownames

row.names(dt) <- c("a", "b", "c", "d", "e")
colnames(dt)[2] <- "letras"     #alteramos unicamente a posicao 2

Podemos alterar valores específicos de um data.frame

dt[3,1] <- "10"
dt$logical<-as.numeric(dt$logical)
dt$letras<-NA

Podemos verificar as ocorrências de um data.frame em outro

biometria <- data.frame(nomes=c("Carlos", "Roberto", "Olivio", "Joel"),
                      altura=c(180, 187, 155, 168),
                      peso=c(80, 90, 98, 64))
esportes <- data.frame(nomes=c("Carlos", "Roberto", "Olivio", "Jomar"),
                     esportes=c("futebol", "remo", "sumo", "maratona"))

biometria$nomes%in%esportes$nomes         #constroi um logico 
[1]  TRUE  TRUE  TRUE FALSE
idx <- biometria$nomes%in%esportes$nomes    #pode ser usado como indice
x <- biometria[idx,]   

Ordenando data.frames por uma coluna

biometria <- biometria[with(biometria, order(altura)), ]

Unindo data.frames com a função merge()

unido <- merge(biometria, esportes, by="nomes")   

Independe da ordem dos data.frames! A busca é feita pelo nome, não pela ordem! O resultado sempre virá em ordem alfabética!

unido<-merge(biometria, esportes, by="nomes", all.x=T) #com todos presentes no primeiro
unido<-merge(biometria, esportes, by="nomes", all.y=T) #com todos presentes no segundo
unido<-merge(biometria, esportes, by="nomes", all=T)   #com todos presentes

Nesse caso, as informações faltantes são preenchidas por NA!

4.3 Trabalhando com Listas

ls<-list(a=c("x", "y", "z", "w", "j"), b=1:4, c=c("Joca", "Bia", "Licurgo"), d=dt)

ls[1]
$a
[1] "x" "y" "z" "w" "j"
ls[[1]]
[1] "x" "y" "z" "w" "j"
ls$a
[1] "x" "y" "z" "w" "j"
class(ls[1])
[1] "list"
class(ls[[1]])
[1] "character"
ls[[c(3,2)]]      #posição na lista e posição no elemento
[1] "Bia"

4.4 Desafio

Pratique sem IA!

Os desafios a seguir foram criados para ajudá-lo a desenvolver suas habilidades de forma independente.
Evite o uso de Inteligência Artificial e tente resolver os problemas por conta própria.
Aprender com a prática fortalecerá seu raciocínio e aprofundará seu conhecimento! 🚀

  1. Considere o seguinte vetor:
x <- c(1, 45, 6, 88, 30, 4)
  1. Obtenha um outro vetor a partir deste que contenha apenas os elementos da posição 2 e da última posição.

  2. Atribua um nome para cada um dos elementos do vetor x.

  3. Ordene o vetor x, em ordem crescente, de duas maneiras: usando a função sort() e a função order().

  1. Considere os seguintes vetores:
x <- c(5, 2, 1, 4)
xx <- c(1, 10, 15, 18)
y <- rep(1, 5)
z <- c(TRUE, FALSE, TRUE, TRUE)
w <- c("Maria", "Elisa", "Pedro")

Explique a operação realizada por cada um dos comandos nos itens abaixo:

sum(x) 
range(x) 
length(y) 
sum(y) 
c(x, y, 13)
xx - x 
c(x, 12) * y 
1:6 + 1 
1:9 + 1:2
x <= 2 
x <= 2 & z 
substring(w, 2, 4) 
paste(substring(w, 1, 2), substring(w, 5, 5), sep = "...") 
  1. Considere o vetor:
set.seed(1)
v <- sample(1:100, 20)
  1. Quantos elementos do vetor ‘v’ são maiores que 60?

  2. Quais as posições do vetor ‘v’ que contem elementos maiores que 60?

  3. Obtenha o valor máximo do vetor ‘v’. Use pelo menos duas abordagens diferentes.

  1. Crie as seguintes sequências apenas usando as funções ‘rep()’ e ‘seq()’. Verifique a documentação das funções.
  1. 1 2 3 4 5 6 7 8 9

  2. “m” “w” “m” “w” “m” “w” “m” “w” “m” “w”

  3. 1 2 3 4 1 2 3 4 1 2 3 4

  4. 4 4 4 3 3 3 2 2 2 1 1 1

  5. 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5

  6. 1 1 3 3 5 5 7 7 9 9 11 11