1 / 18

Indexação de vectores

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.

Download Presentation

Indexação de vectores

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. > 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

  3. 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.

  4. 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

  5. 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.

  6. 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

  7. > 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')

  8. 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)]

  9. 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')

  10. 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

  11. 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

  12. 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

  13. 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

  14. Á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

  15. 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

  16. 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

  17. 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’)]

  18. 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)

More Related