180 likes | 360 Views
Indexação de vectores. Para aceder a um elemento de um vector usamos a sua posição entre parênteses rectos. O R também nos permite usar vectores dentro desses parênteses rectos. Esses vectores chamam-se vectores de índices. Existem vários tipos de vectores de índices.
E N D
Indexação de vectores • Para aceder a um elemento de um vector usamos a sua posição entre parênteses rectos. • O R também nos permite usar vectores dentro desses parênteses rectos. • Esses 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. > 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 > x[x>0] [1] 4 45 90
> x • [1] 0 -3 4 -1 45 90 -5 • 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 R também nos permite usar um vector de números inteiros como índice. • 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" “OU” lógico “E” lógico
Podemos ainda usar um vector com números negativos • Permite-nos 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 '':'‘ • Experimentar sem os parênteses.
Um vector também pode ser indexado por um vector de strings • Isto consegue-se 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
Os índices também podem ser vazios • Significa 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 • Esta última instrução 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.
Algumas funções úteis sobre vectores • Estatísticas básicas > 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 > sort(tx.infl) Alemanha França Espanha Itália Portugal 1.9 2.0 2.1 2.3 2.5 > max(tx.infl) > min(tx.infl) [1] 2.5 [1] 1.9 > which.max(tx.infl) > which.min(tx.infl) [1] 1 [1] 5 > tx.infl[which.max(tx.infl)] Portugal 2.5 > mean(tx.infl) > sd(tx.infl) [1] 2.16 [1] 0.2408319
> summary(tx.infl) Min. 1st Qu. Median Mean 3rd Qu. Max. 1.90 2.00 2.10 2.16 2.30 2.50 > barplot(tx.infl) > barplot(tx.infl,main='Inflação na UE',ylab='Taxa',xlab='Países')
Imagine que possui informação quanto aos preços de 10 produtos. Guarde-os num objecto apropriado do R. > preços <- c(54,32,76,45.3,45.8,132,47,43,98,100) 2. Quais os valores de IVA a pagar por cada produto? > 0.19 * preços 3. Suponha que possui informação sobre os nomes dos produtos. Tire partido dessa informação para mais facilmente aceder aos preços dos produtos. > names(preços) <- c(’p1’,’p2’,’p3’,’p4’,’p5’,’p6’,’p7’,’p8,’p9’,’p10’) Alternativa (mais prática para muitos produtos): > names(preços) <- paste(‘p’,1:10,sep=“”) 4. Ordene os produtos por ordem crescente de preço. Como obter os preços por ordem decrescente (sugestão consulte o “help” da função sort). > sort(preços) > sort(preços, decreasing=T) 5. Quais o mais caro e o mais barato dos produtos? > max(preços) OU > preços[which.max(preços)] > min(preços) > preços[which.mix(preços)]
6. Coloque num vector os produtos com preço superior à média dos preços. > sup <- preços[preços > mean(preços)] 7. Quais os 3 produtos mais caros? > sort(preços,decreasing=T)[1:3] • Suponha que pretende guardar as vendas nos meses do último ano das 2 sucursais de uma empresa. Escolha o objecto do R apropriado e tire partido das potencialidades do R para facilitar o acesso a esta informação. > vendas <- matrix(c(23,43,54,23,53,43,54,65,76,34,65,34,546,67, + 35,45,56,57,34,34,46,56,57,678),2,12) > colnames(vendas) <- c('Jan','Fev','Mar','Abr','Mai','Jun','Jul', + 'Ago','Set','Out','Nov','Dez') > rownames(vendas) <- c('Braga','Faro') • Como saber qual o volume de vendas médio de cada sucursal ao longo do ano? > mean(vendas['Braga',]) > mean(vendas['Faro',]) Experimente esta alternativa: > apply(vendas,1,mean) tente também > apply(vendas,2,mean) 10. Construa um gráfico de barras com as vendas de uma das sucursais ao longo do ano. > barplot(vendas['Braga',],main='Vendas em Braga', + ylab='Volume de Vendas')
Matrizes • As matrizes arranjam a informação em duas dimensões. • Em contraposição aos vectores que a arranjam numa só dimensão. • Em R as matrizes não são mais do que vectores com duas dimensões. • Podemos guardar um conjunto de valores numa matriz da seguinte forma: > m <- matrix(c(45,23,66,77,33,44,56,12,78,23),2,5) > m [,1] [,2] [,3] [,4] [,5] [1,] 45 66 33 56 78 [2,] 23 77 44 12 23 Número de linhas Número de colunas
Os números foram “espalhados” por coluna. > m <- matrix(c(45,23,66,77,33,44,56,12,78,23),2,5) [,1] [,2] [,3] [,4] [,5] [1,] 45 66 33 56 78 [2,] 23 77 44 12 23 • Podemos espalhar os números por linha da seguinte forma: > m <- matrix(c(45,23,66,77,33,44,56,12,78,23),2,5,byrow=T) > m [,1] [,2] [,3] [,4] [,5] [1,] 45 23 66 77 33 [2,] 44 56 12 78 23 • Podemos aceder aos elementos de uma matriz da seguinte forma: > m[2,4] [1] 78 > m[1,1] [1] 45 • Podemos aceder a todos os elementos de uma dimensão da seguinte forma: > m[1,] [1] 45 23 66 77 33 > m[,3] [1] 66 12 1ª linha Note : o resultado é um vector. 3ª coluna
As regras da reciclagem também são usadas com matrizes > preços.lojas.2002 <- matrix(c(10.4,12,32,34,32.3,30.2,343,350),2,4) > preços.lojas.2002 [,1] [,2] [,3] [,4] [1,] 10.4 32 32.3 343 [2,] 12.0 34 30.2 350 > (preços.lojas.2003 <- 1.04 * preços.lojas.2002) [,1] [,2] [,3] [,4] [1,] 10.816 33.28 33.592 356.72 [2,] 12.480 35.36 31.408 364.00
Dar nomes às dimensões • Por vezes é mais simples usarmos nomes nas dimensões. > preços.lojas.2002 <- matrix(c(10.4,12,32,34,32.3,30.2,343,350),2,4) > colnames(preços.lojas.2002) <- c('p1','p2','p3','p4') > rownames(preços.lojas.2002) <- c('porto','lisboa') > preços.lojas.2002 p1 p2 p3 p4 porto 10.4 32 32.3 343 lisboa 12.0 34 30.2 350 > preços.lojas.2002['porto','p3'] [1] 32.3 > preços.lojas.2002['lisboa',] p1 p2 p3 p4 12.0 34.0 30.2 350.0 > preços.lojas.2002[,'p2'] porto lisboa 32 34 > preços.lojas.2002[,2] porto lisboa 32 34 Continuamos a poder usar osnúmeros
Álgebra Matricial • Para obtermos a multiplicação matricial de duas matrizes usamos: > m1 <- matrix(c(45,23,66,77,33,44),2,3) > m1 [,1] [,2] [,3] [1,] 45 66 33 [2,] 23 77 44 > m2 <- matrix(c(5,3,466,54.5,3.2,-34),3,2) > m2 [,1] [,2] [1,] 5 54.5 [2,] 3 3.2 [3,] 466 -34.0 > m1 %*% m2 [,1] [,2] [1,] 15801 1541.7 [2,] 20850 3.9
Transposta de uma matriz > m1 [,1] [,2] [,3] [1,] 45 66 33 [2,] 23 77 44 • Determinante e inversa de uma matriz quadrada > m <- matrix(c(34,-23,43,5),2,2) > det(m) [1] 1159 > solve(m) [,1] [,2] [1,] 0.004314064 -0.03710095 [2,] 0.019844694 0.02933563 > t(m1) [,1] [,2] [1,] 45 23 [2,] 66 77 [3,] 33 44
Resolução de sistemas de equações lineares • A função solve() também pode ser usada para resolver este tipo de sistemas. • Exemplo: > coefs <- matrix(c(-4,54.3,0.3,-4),2,2) > colnames(coefs) <- c('x','y') > rownames(coefs) <- c('eq1','eq2') > coefs x y eq1 -4.0 0.3 eq2 54.3 -4.0 > ys <- c(12.3,45) > solve(coefs,ys) x y 216.2069 2923.7586
Data Frames • É semelhante a uma matriz mas as colunas têm nomes • Corresponde a uma tabela de uma BD • >notas.inform<-data.frame(nros=c(23,34,23,12), • +turma = c(‘tp1’,’tp1,’tp2’.tp3’), • +notas = c(10.3,9.5,7.9,12)) • notas.inform • Um data frame pode ser acedido como uma matriz • >notas.inform[,2] mostra a coluna 2, >notas.inform$nros • notas.inform[notas.inform$notas>10,] todos os campos • notas.inform[notas.inform$notas>10,c(‘nros’,’notas’)]
A função attach associa a cada coluna o seu nome • >attach(notas.inform) • Semelhante a fazer >notas<- notas.inform$notas ... • >notas.inform[notas>10,] mostra todas as linhas • >turma Mostra a coluna como notas.inform$turmas • A função detach desfaz o attach • >detach(notas.inform) • Acrescentar novas colunas (=número de elementos) • >notas.inform&resultado<-c(‘aprovado’,’oral’,…) • >nrow(notas.inform) >ncol(notas.inform) • Editor • >notas.inform<-edit(notas.inform)