Na Secção 1.4 já vimos exemplos de como extrair um elemento de um vector indicando a sua posição entre parênteses rectos. O R também nos permite usar vectores dentro desses parênteses rectos. Estes vectores chamam-se vectores de índices. Existem vários tipos de vectores de índices. Os vectores de índices booleanos extraem de um vector os elementos correspondentes a posições verdadeiras. Vejamos um exemplo concreto,
> x <- c(0,-3,4,-1,45,90,-5) > x [1] 0 -3 4 -1 45 90 -5 > x > 0 [1] FALSE FALSE TRUE FALSE TRUE TRUE FALSE > y <- x>0
A terceira instrução do código mostrado acima é uma condição lógica envolvendo o vector x. Esta condição é uma comparação com o valor zero. Devido à regra de reciclagem, o resultado desta comparação é um vector de valores lógicos resultantes de fazer a comparação para cada elemento do vector x. Na instrução seguinte guardamos este vector lógico no objecto y. Usando este vector como um vector de índices, podemos obter os elementos de x que são maiores do que zero, da seguinte forma,
> x[y] [1] 4 45 90
Como os elementos de y que são verdadeiros (TRUE) são o 3^o, 5^o e o 6^o, isto corresponde a extrair esses elementos de x, que é o resultado que obtemos com a instrução mostrada acima. Poderíamos obter um resultado igual, evitando criar um novo vector, fazendo
> x[x>0] [1] 4 45 90
Tirando partido da gama de operadores lógicos disponíveis no R, podemos construir vectores de indexação lógicos mais complexos,
> x[x <= -2 | x > 5] [1] -3 45 90 -5 > x[x > 40 & x < 100] [1] 45 90
O operador ``|
'' corresponde ao OU (disjunção) lógico, enquanto o operador ``&
'' é o E (conjunção) lógica. Isto quer dizer que a primeira instrução dá como resultado os elementos de x que são menores ou iguais a -2, ou maiores do que 5. O segundo exemplo, por sua vez, mostra-nos os elementos de x que são maiores do que 40 e menores do que 100.
O R também nos permite usar um vector de números inteiros como índice de um outro vector. Os números desse vector de índices correspondem aos elementos a extrair do outro vector,
> (v <- c('a','b','c','d','e','f','g','h','i','j')) [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" > v[c(4,6)] [1] "d" "f" > v[1:3] [1] "a" "b" "c"
Podemos ainda usar um vector com números negativos, o que nos permite indicar quais os elementos a não obter como resultado da indexação,
> v[-1] [1] "b" "c" "d" "e" "f" "g" "h" "i" "j" > v[-c(4,6)] [1] "a" "b" "c" "e" "g" "h" "i" "j" > v[-(1:3)] [1] "d" "e" "f" "g" "h" "i" "j"
Note bem a importância dos parênteses no último exemplo, devido à precedência do operador ``:'' já mencionada na Secção 1.7.
Um vector também pode ser indexado por um vector de strings tirando partido do facto de o R permitir dar nomes aos elementos de um vector através na função names. Vectores com os elementos com nomes são por vezes preferíveis pois as suas ``posições'' são mais facilmente memorizáveis. Suponhamos que tínhamos um vector com as taxas de inflação de 5 países europeus. Poderíamos criar um vector com nomes da seguinte forma,
> tx.infl <- c(2.5,2,2.1,2.3,1.9) > names(tx.infl) <- c('Portugal','França','Espanha','Itália','Alemanha') > tx.infl Portugal França Espanha Itália Alemanha 2.5 2.0 2.1 2.3 1.9
Os elementos do vector tx.infl podem agora ser acedidos usando os seus nomes,
> tx.infl['Portugal'] Portugal 2.5 > tx.infl[c('Espanha','Alemanha')] Espanha Alemanha 2.1 1.9
Finalmente, os índices podem ser vazios, o que tem o significado que todos os elementos são seleccionados. Por exemplo, se pretendemos preencher todas as posições de um vector com zeros podemos fazer x[] <- 0. De notar, que isto é diferente de fazer x <- 0, que teria como efeito atribuir ao vector x um vector com um único elemento (zero), enquanto que a primeira alternativa, assumindo que o vector x já existia, iria substituir todos os seus elementos por zero. Tente ambas as alternativas.