vectores - fcupltorgo/ensino/fep/acetatos/vectores.pdf · • todos os vectores em r têm ......
Post on 20-Jan-2019
219 Views
Preview:
TRANSCRIPT
Luís Torgo, 2002 FEP, UP
Vectores
• Um vector é um tipo de objecto usado para armazenar um conjunto de dados de um determinado tipo (ex. números), que estejam relacionados – Ex.: as taxas de juro dos países da UE
• Os elementos contidos num vector podem ser acedidos individualmente.
• Todos os vectores em R têm um modo e um tamanho.
• O modo determina o tipo de valores guardado no vector. – Podemos ter vectores com modo character, logical, numeric e complex.
– Ou seja, podemos ter vectores para armazenar conjuntos de caracteres, valores lógicos (F ou T ou FALSE ou TRUE), números, e números complexos.
• O tamanho de um vector é o número de elementos que ele contém, e pode ser obtido com a função length() aplicada ao vector.
Luís Torgo, 2002 FEP, UP
Criar vectores
• Para criar um vector usamos a função c(), separando os elementos do vector por vírgulas.
> pr eços <- c( 4, 7, 23. 5, 76. 2, 80)
> pr eços
[ 1] 4. 0 7. 0 23. 5 76. 2 80. 0
> l engt h( pr eços)
[ 1] 5
> mode( pr eços)
[ 1] " numer i c"
• Todos os elementos têm que ser do mesmo tipo (modo).– Caso tentemos criar um vector com elementos de tipo diferente o
R vai forçá-los a ser do mesmo tipo, alterando-os. > v <- c( 4, 7, 23. 5, 76. 2, 80, " r r t " )
> v
[ 1] " 4" " 7" " 23. 5" " 76. 2" " 80" " r r t "
Luís Torgo, 2002 FEP, UP
• As strings em R são conjuntos de caracteres englobados por aspas ou plicas,
> mensagens <- c( " r r t " , ' ol a' , ' i st o e uma st r i ng' )
> mensagens
[ 1] " r r t " " ol a" " i st o e uma st r i ng"
• Todos os vectores podem ter um elemento especial que é o NA. Este valor representa um valor desconhecido. – Exemplo: se temos os lucros trimestrais de uma empresa
guardados num vector, mas desconhecemos o seu valor no terceiro trimestre, poderíamos usar a seguinte instrução para criar esse vector,
> l ucr os <- c( 234000, 245000, NA, 124500)
> l ucr os
[ 1] 234000 245000 NA 124500
Luís Torgo, 2002 FEP, UP
Aceder aos elementos dos vectores
• Os elementos de um vector podem ser acedidos através de um índice. – Na sua forma mais simples um índice é um número indicando o
elemento que pretendemos aceder. Esse número é colocado entre parênteses rectos a seguir ao nome do vector,
> l ucr os[ 2]
[ 1] 245000
• Podemos alterar o conteúdo de um elemento particular de um vector,
> l ucr os[ 3] <- 45000
> l ucr os
[ 1] 234000 245000 45000 124500
> l ucr os <- c( 234000, 245000, NA, 124500)
> l ucr os
[ 1] 234000 245000 NA 124500
Luís Torgo, 2002 FEP, UP
• Podemos criar vectores vazios usando a função vector(), > not as. al unos <- vect or ( )
• O tamanho de um vector já existente pode ser alterado atribuindo mais elementos a índices até agora inexistentes,
> not as. al unos[ 3] <- 15. 4
> not as. al unos
[ 1] NA NA 15. 4
– Os dois primeiros elementos do vector notas.alunos, que anteriormente era um vector vazio, ficaram com o valor NA ao colocarmos o valor 45 no terceiro elemento.
• Para diminuirmos o tamanho de um vector podemos usar a instruçãode atribuição. Por exemplo,
> v <- c( 45, 243, 78, 343, 445, 645, 2, 44, 56, 77)
> v
[ 1] 45 243 78 343 445 645 2 44 56 77
> v <- c( v[ 5] , v[ 7] )
> v
[ 1] 445 2
Luís Torgo, 2002 FEP, UP
Operações com vectores
• Um dos aspectos mais poderosos da linguagem R é a possibilidade de ''vectorizar'' a maioria das suas funções.– Ao aplicar uma função a um vector, obtemos como resultado um
vector de resultados.• Cada elemento é o resultado de aplicar a função a cada um dos elementos do
vector inicial.
> númer os <- c( 4, 7, 23. 5, 76. 2, 80)
> r aí zes <- sqr t ( númer os)
> r aí zes
[ 1] 2. 000000 2. 645751 4. 847680 8. 729261 8. 944272
– Ao atribuir a raízes o resultado de aplicar a função sqrt() ao vector números, estamos de facto a criar um vector com as raízes quadradas dos números contidos em números.
Luís Torgo, 2002 FEP, UP
Operações aritméticas com vectores
• Podemos aplicar os operadores aritméticos a vectores, > l oj a1 <- c( 4, 6, 87)
> l oj a2 <- c( 34, 32. 4, 12)
> l oj a1+l oj a2
[ 1] 38. 0 38. 4 99. 0
• O que acontece se tentamos realizar operações envolvendo vectores de tamanho diferente? – O R vai usar um regra de reciclagem dos valores do vector mais
curto até este atingir o tamanho do maior. Por exemplo, > v1 <- c( 4, 6, 8, 24)
> v2 <- c( 10, 2)
> v1+v2
[ 1] 14 8 18 26
– É como se o vector c(10,2) fosse de facto c(10,2,10,2).
Os elementos são somadosum a um.
Luís Torgo, 2002 FEP, UP
• Se os tamanhos não são múltiplos um do outro, o R imprime um aviso no écran,
> v1 <- c( 4, 6, 8, 24)
> v2 <- c( 10, 2, 4)
> v1+v2
[ 1] 14 8 12 34
War ni ng message: l onger obj ect l engt h i s not a mul t i pl e of
shor t er obj ect l engt h i n: v1 + v2
– Repare-se que um aviso não é um erro, o que quer dizer que a operação foi levada a cabo.
• Um número é de facto armazenado em R como um vector de tamanho 1. Logo, devido à regra da reciclagem, podemos fazer> pr eços <- c( 4, 6, 8, 24)
> 1. 19 * pr eços
[ 1] 4. 76 7. 14 9. 52 28. 56
– O número 1.19 (de facto o vector c(1.19)!) foi reciclado até atingir o tamanho do vector preços
– O resultado é a multiplicação dos elementos todos deste vector por 1.19.
Luís Torgo, 2002 FEP, UP
Factores
• Os factores proporcionam uma forma fácil e compacta de lidar comdados categóricos (variáveis nominais).
• O R possui várias funções que tiram partido do facto de guardarmos informação categórica como factores em vez de usarmos strings.
• Suponhamos que pretendemos guardar o sexo de 10 indivíduos num vector,
> s <- c( ' f ' , ' m' , ' m' , ' m' , ' f ' , ' m' , ' f ' , ' m' , ' f ' , ' f ' )
> s
[ 1] " f " " m" " m" " m" " f " " m" " f " " m" " f " " f "
• Podemos transformar um vector de caracteres num factor da seguinte forma,
> s <- f act or ( s)
> s
[ 1] f m m m f m f m f f
Level s: f m
Luís Torgo, 2002 FEP, UP
• Suponhamos que temos 4 novos indivíduos cujo sexo também pretendemos armazenar num factor. – Imaginemos que todos pertencem ao sexo masculino. Se
pretendemos que o factor resultante mantenha os 2 níveis possíveis para o sexo de um indivíduo teremos que fazer,
> out r o. s <- f act or ( c( ' m' , ' m' , ' m' , ' m' ) , l evel s=c( ' f ' , ' m' ) )
> out r o. s
[ 1] m m m m
Level s: f m
– Sem o parâmetro “ levels” , o factor resultante teria um único nível (m), uma vez que este é o único valor que ocorre no vector de caracteres que estamos a transformar num factor.
Luís Torgo, 2002 FEP, UP
Contagem de ocorrências em factores
• A função table() permite-nos contar o número de ocorrências de cada nível de um factor,
> t abl e( s)
s
f m
5 5
> t abl e( out r o. s)
out r o. s
f m
0 4
Luís Torgo, 2002 FEP, UP
• A função table() também pode ser usada para fazer tabulaçõescruzadas de dois factores.– desde que tenham o mesmo tamanho.
• Imaginemos que temos um outro vector com a gama de idades dos indivíduos cujo sexo está armazenado em s.
• Podemos fazer uma tabulação cruzada da idade e do sexo dos 10 indivíduos, da seguinte forma,
> i dade <- f act or ( c( ' adul t o' , ' adul t o' , ' j ovem' , ' j ovem' , ' adul t o' , ' adul t o' ,
+ ' adul t o' , ' j ovem' , ' adul t o' , ' j ovem' ) )
> i dade
[ 1] adul t o adul t o j ovem j ovem adul t o adul t o adul t o j ovem adul t o j ovem
Level s: adul t o j ovem
> s
[ 1] f m m m f m f m f f
Level s: f m
> t abl e( i dade, s)
s
i dade f m
adul t o 4 2
j ovem 1 3
Prompt de continuaçãode linha
Luís Torgo, 2002 FEP, UP
Sequências
• Podem-se gerar sequências em R de várias formas. – Por exemplo, imaginemos que pretendemos criar um vector com
os número de 1 a 1000. Em vez de os escrevermos todos, podemos usar,
> códi gos. pr odut os <- 1: 1000
• Devemos ter algum cuidado com a precedência do operador '':'' em relação aos operadores aritméticos,
> 10: 15- 1
[ 1] 9 10 11 12 13 14
> 10: ( 15- 1)
[ 1] 10 11 12 13 14
Luís Torgo, 2002 FEP, UP
• O operador '':'' também pode ser usado para gerar sequências descendentes,
> 5: 0
[ 1] 5 4 3 2 1 0
• Para gerar sequências com números reais podemos usar a função seq(),
> seq( - 4, 1, 0. 5)
[ 1] - 4. 0 - 3. 5 - 3. 0 - 2. 5 - 2. 0 - 1. 5 - 1. 0 - 0. 5 0. 0 0. 5 1. 0
> seq( f r om=1, t o=5, l engt h=4)
[ 1] 1. 000000 2. 333333 3. 666667 5. 000000 > seq( f r om=1, t o=5, l engt h=2)
[ 1] 1 5
> seq( l engt h=10, f r om=- 2, by=. 2)
[ 1] - 2. 0 - 1. 8 - 1. 6 - 1. 4 - 1. 2 - 1. 0 - 0. 8 - 0. 6 - 0. 4 - 0. 2
Luís Torgo, 2002 FEP, UP
• Uma outra função bastante útil para gerar sequências é a função rep()> r ep( 5, 10)
[ 1] 5 5 5 5 5 5 5 5 5 5
> r ep( ' si m' , 3)
[ 1] " s i m" " s i m" " s i m"
> r ep( 1: 3, 2)
[ 1] 1 2 3 1 2 3
• A função gl() pode ser usada para gerar sequências envolvendo factores. A sintaxe desta função égl(k,n), em que k é o número de níveis do factor e n o número de repetições de cada nível.
> gl ( 3, 5)
[ 1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
Level s: 1 2 3
> gl ( 2, 5, l abel s=c( ' nao' , ' s i m' ) )
[ 1] nao nao nao nao nao si m si m si m si m si m
Level s: nao si m
Luís Torgo, 2002 FEP, UP
Sequências aleatórias
• O R tem uma série de funções para gerar sequências aleatórias de acordo com uma série de funções de distribuição de probabilidade.– Essas funções têm a forma genérica rfunc(n, par1, par2, ...), em que n é o
número de dados a gerar, e par1, par2, ... são valores de alguns parâmetros que a função específica a usar possa precisar.
– Por exemplo, se pretendemos 10 números gerados aleatoriamente de acordo com uma distribuição normal de média 0 e desvio padrão unitário, podemos fazer,
> r nor m( 10)
[ 1] - 0. 306202028 0. 335295844 1. 199523068 2. 034668704 0. 273439339
[ 6] - 0. 001529852 1. 351941008 1. 643033230 - 0. 927847816 - 0. 163297158
• Se preferirmos 10 números provenientes de uma distribuição normal com média 10 e desvio padrão 3, faríamos
> r nor m( 10, mean=10, sd=3)
[ 1] 7. 491544 12. 360160 12. 879259 5. 307659 11. 103252 18. 431678 9. 554603
[ 8] 9. 590276 7. 133595 5. 498858
Luís Torgo, 2002 FEP, UP
• De igual modo para obter 5 números obtidos de forma aleatória de uma distribuição t de Student com 10 graus de liberdade, fazemos
> r t ( 5, df =10)
[ 1] - 0. 46608438 - 0. 44270650 - 0. 03921861 0. 18618004 2. 23085412
• O R tem muitas mais funções para outras distribuições de probabilidade, bem como funções semelhantes para obter a densidade de probabilidade, as densidades acumuladas e osquartis das distribuições.
Luís Torgo, 2002 FEP, UP
Indexação de vectores• Para aceder a um elemento de um vector temos vindo a usar 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.
> var i ações <- c( 0, - 3, 4, - 1, 45, 90, - 5)
> var i ações
[ 1] 0 - 3 4 - 1 45 90 - 5
> var i ações > 0
[ 1] FALSE FALSE TRUE FALSE TRUE TRUE FALSE
> posi t i vos <- var i ações > 0
> var i ações[ posi t i vos]
[ 1] 4 45 90> var i ações[ var i ações > 0]
[ 1] 4 45 90
Luís Torgo, 2002 FEP, UP
• Tirando partido da gama de operadores lógicos disponíveis no R, podemos construir vectores de indexação lógicos mais complexos,
> var i ações[ var i ações <= - 2 | var i ações > 5]
[ 1] - 3 45 90 - 5
> var i ações[ var i ações > 40 & var i ações < 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, > ( l et r as <- c( ' a' , ' b' , ' c ' , ' d' , ' e' , ' f ' , ' g' , ' h' , ' i ' , ' j ' ) ) [ 1] " a" " b" " c" " d" " e" " f " " g" " h" " i " " j "
> l et r as[ c( 4, 6) ]
[ 1] " d" " f "
> l et r as[ 1: 3]
[ 1] " a" " b" " c"
“OU” lógico
“E” lógico
> var i ações
[ 1] 0 - 3 4 - 1 45 90 - 5
Luís Torgo, 2002 FEP, UP
• Podemos ainda usar um vector com números negativos– Permite-nos indicar quais os elementos a não obter como resultado
da indexação, > l et r as[ - 1]
[ 1] " b" " c" " d" " e" " f " " g" " h" " i " " j "
> l et r as[ - c( 4, 6) ]
[ 1] " a" " b" " c" " e" " g" " h" " i " " j "
> l et r as[ - ( 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 '':''– O que acontece sem os parênteses ?
Luís Torgo, 2002 FEP, UP
• 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, > t x. i nf l <- c( 2. 5, 2, 2. 1, 2. 3, 1. 9)
> names( t x. i nf l ) <- c( ' Por t ugal ' , ' Fr ança' , ' Espanha' , ' I t ál i a' , ' Al emanha' )
> t x. i nf l
Por t ugal Fr ança Espanha I t ál i a Al emanha
2. 5 2. 0 2. 1 2. 3 1. 9
• Os elementos do vector tx.infl podem agora ser acedidos usando os seus nomes,
> t x. i nf l [ ' Por t ugal ' ]
Por t ugal
2. 5
> t x. i nf l [ c( ' Espanha' , ' Al emanha' ) ]
Espanha Al emanha
2. 1 1. 9
Luís Torgo, 2002 FEP, UP
• 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
• Porquê?
Luís Torgo, 2002 FEP, UP
Algumas funções úteis sobre vectores• Estatísticas básicas> t x. i nf l <- c( 2. 5, 2, 2. 1, 2. 3, 1. 9)
> names( t x. i nf l ) <- c( ' Por t ugal ' , ' Fr ança' , ' Espanha' , ' I t ál i a' , ' Al emanha' )
> t x. i nf l
Por t ugal Fr ança Espanha I t ál i a Al emanha
2. 5 2. 0 2. 1 2. 3 1. 9
> sor t ( t x. i nf l )
Al emanha Fr ança Espanha I t ál i a Por t ugal
1. 9 2. 0 2. 1 2. 3 2. 5> max( t x. i nf l )
[ 1] 2. 5
> mi n( t x. i nf l )
[ 1] 1. 9
> whi ch. max( t x. i nf l )
[ 1] 1
> whi ch. mi n( t x. i nf l )
[ 1] 5
> t x. i nf l [ whi ch. max( t x. i nf l ) ]
Por t ugal
2. 5
> mean( t x. i nf l )
[ 1] 2. 16
> sd( t x. i nf l )
[ 1] 0. 2408319
Luís Torgo, 2002 FEP, UP
> summar y( t x . i nf l )
Mi n. 1st Qu. Medi an Mean 3r d Qu. Max.
1. 90 2. 00 2. 10 2. 16 2. 30 2. 50
> bar pl ot ( t x . i nf l )
> bar pl ot ( t x . i nf l , mai n=' I nf l ação na UE' , y l ab=' Taxa' , x l ab=' Paí ses' )
top related