Indexação

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.


Luis Torgo 2003-10-03