Trabalhando com Matrizes
Nos artigos anteriores, usamos nossas habilidades de programação quando analisamos os dados de disciplinas. Praticamos o trabalho com vetores, que servirão de base para o conhecimento que construímos à medida que continuamos a aprender R.
Neste artigo, analisaremos dados do mundo real sobre classificações de universidades. Expandiremos nosso conhecimento das estruturas de dados do R à medida que exploramos como criar, indexar e executar operações em matrizes .
Digamos que você tenha sido aceito em várias universidades importantes. Para decidir em qual você vai entrar, você tem que encontrar uma maneira de pontuá-las usando dados sobre a qualidade da educação, influência, custo e outros fatores. Os dados com os quais trabalharemos vêm do conjunto de dados do Ranking de Universidades do Times Higher Education . As 100 melhores universidades do mundo são classificadas usando vários critérios de qualidade de educação e influência em todo o mundo. Criamos um conjunto de dados menor contendo dados que você precisará durante esse artigo. Aqui estão as primeiras linhas:
Os dados são organizados em linhas e colunas . Cada linha corresponde a uma universidade específica e cada coluna contém informações sobre uma classificação diferente para cada universidade. Rankings mais altos são representados por números menores. Por exemplo, a classificação de Harvard world_rank
é mais alta que a de Stanford.
Para trabalhar com os dados em R, poderíamos criar um vetor para cada universidade. Em vez disso, aprenderemos a usar uma matriz para armazenar todos os dados da universidade em um só lugar. Embora os vetores sejam unidimensionais, as matrizes são bidimensionais e consistem em linhas e colunas em um layout retangular:
Como os vetores, as matrizes armazenam dados de um tipo (como numérico ou lógico). Uma matriz pode conter quantas linhas e colunas forem necessárias, para que possamos criar uma contendo classificações para todas as universidades aceitas.
Nesta missão, trabalharemos com dados armazenados em uma matriz, à medida que analisamos os dados do ranking e do ensino das universidades para decidir se uma universidade entrará no páreo.
Vamos começar criando uma matriz contendo os dados de classificação da universidade para que possamos começar a analisá-la para encontrar sua universidade ideal.
Vamos começar com vetores contendo os rankings de cada universidade. Lembre-se que nos artigos anteriores usamos a funçãoc()
para criar vetores:
harvard <- c ( 1 , 1 , 1 , 1 , 3 )stanford <- c ( 2 , 9 , 3 , 4 , 10 )mit <- c ( 3 , 3 , 2 , 2 , 1 )cambridge <- c ( 4 , 2 , 6 , 13 , 48 )oxford <- c ( 5 , 7 , 12 , 9 , 15 )columbia <- c ( 6 , 13 , 13 , 12 , 4 )
A combinação de vetores em matrizes é direta devido às semelhanças nas duas estruturas de dados. Ambos consistem em um único tipo de dados (aqui, numérico). Nesse caso, podemos imaginar a criação de uma matriz empilhando vetores de classificação universitários, um em cima do outro, com elementos alinhados por posição:
Para combinar vetores em uma matriz, podemos usar a função rbind()
. O "r" rbind()
significa " linhas" - essa função nos permite combinar vários vetores por linha . Para demonstrar, vamos combinar os vetores harvard
e stanford
usando rbind()
:
harv_stan <- rbind ( harvard , stanford )
A matriz resultante contém classificações para Harvard e Stanford:
Também podemos usar rbind()
para adicionar uma única linha a uma matriz existente ou combinar duas matrizes empilhando-as. Por exemplo:
rbind ( harv_stan , mit)
Usando rbind()
, nós adicionamos o vetor MIT
ao vetorharv_stan
como uma nova linha:
Vamos criar uma matriz contendo todos os dados da universidade.
Vamos aos exercícios:
- Temos vetores contendo dados de classificação para cada universidade. Crie uma matriz denominada
uni_matrix
desses vetores usando a funçãorbind()
para todas as universidades.
A matriz que criamos contém dados de classificação para cada universidade:
Quando usamos a funçãorbind()
para criar uma matriz a partir de vetores com atributos de nome, os nomes de vetor são retidos como atributos de nome de linha. No entanto, nossas colunas não possuem atributos de nome associados a elas. Adicionar nomes a linhas ou colunas de uma matriz é semelhante aos elementos de nomenclatura de um vetor.
Tenha em mente que os atributos são diferentes dos elementos de vetores ou matrizes — eles não são armazenados nessas estruturas de dados e você não pode executar operações neles. Atributos facilitam a interpretação do conteúdo de vetores e matrizes.
No artigo anterior, aprendemos a adicionar atributos de nome a vetores usando a função de atributo names()
. Como as matrizes têm linhas e colunas, existem funções separadas para adicionar atributos de nome a cada uma delas:
- Linhas :
rownames()
- Colunas :
colnames()
Já temos nomes de universidades para linhas uni_matrix
, mas precisamos adicionar nomes de colunas para que possamos ver as categorias para cada classificação da universidade.
Para ilustrar como isso funciona, vamos nomear as colunas na matrizharv_stan
que criamos no exemplo anterior:
harv_stan <- rbind ( harvard , stanford )
colnames ( harv_stan ) <- c("world_rank", "quality_of_education", "influence", "broad_impact" ,"patents")
Se nós inspecionarmos harv_stan
, podemos ver que as colunas foram nomeadas:
Para nomear linhas usando rownames()
, se usa a mesma sintaxe.
Vamos atribuir nomes a todas as colunas da matrizuni_matrix
.
Vamos aos exercicíos;
- Nomeie as colunas de
uni_matrix
uso do vetorcategories
.
Agora que o exercício acima foi feito, a matrizuni_matrix
tem nomes associados a suas linhas e colunas:
Vamos voltar ao nosso objetivo inicial: decidir em qual universidade participar. Ao analisar seus dados, você percebe que, embora tenha informações para ajudá-lo a avaliar a qualidade e o impacto da educação das seis universidades, também gostaria de obter informações sobre o custo.
Para resolver isso, fizemos algumas pesquisas e elaboramos dados sobre as mensalidades anuais, em dólares americanos, para cada universidade:
- Harvard $43,280
- Stanford $45,000
- MIT $45,016
- Cambridge $49,350
- Oxford $28,450
- Columbia $55,161
Vamos adicionar esses dados de valores à nossa matriz para que possamos continuar analisando os dados para maximizar sua escolha de universidade.
Primeiro, vamos criar um vetor contendo os dados dos valores:
value <- c(43280,45000,45016,49350,28450,55161)
Em seguida, precisamos adicionar o vetorvalue
a matriz uni_matrix
como uma coluna. Primeiro, devemos nos certificar de que o novo vetor tenha as dimensões certas antes de combiná-lo com a nossa matriz. Lembre-se de que o comportamento de "reciclagem" de R pode resultar em valores repetidos indesejados se os objetos não tiverem o mesmo comprimento.
Como estamos trabalhando com um pequeno conjunto de dados, é fácil visualizar o comprimento do vetor e compará-lo com o número de linhas na matriz. No entanto, quando trabalhamos com conjuntos de dados maiores, esse não será o caso.
No primeiro artigo, aprendemos a usar a funçãolength()
para identificar o número de elementos em um vetor. Agora, aprenderemos como identificar as dimensões (números de linhas e colunas) de uma matriz usando a função dim()
.
Quando uma matriz é passada para a função dim()
, a saída da função é um vetor que contém dois números: o número de linhas e o número de colunas na matriz:
dim ( harv_stan )
No exemplo acima, a matriz harv_stan
possui duas linhas e cinco colunas.
Como a funçãodim()
produz um vetor, podemos construir o que aprendemos no último artigo sobre a indexação de vetores por posição. Podemos escrever uma expressão para comparar o comprimento de um vetor e o número de linhas ou colunas em uma matriz para determinar se são iguais.
Se quisermos adicionar o vetor harv_stan_value
como uma nova coluna à matrizharv_stan
, queremos que o comprimento de harv_stan_value
seja igual ao número de linhas em harv_stan
. Lembre-se de que a ordem das dimensões na saídadim()
é sempre: linhas, colunas .
Podemos passar a matrizharv_stan
para a funçãodim()
e, em seguida, usamos colchetes para indexar o vetor resultante de linhas e colunas. Vamos usar [1]
para retornar o número de linhas, que é o elemento na primeira posição do vetor. Podemos escrever uma linha de código:
dim ( harv_stan ) [ 1 ]
Para testar se o número de linhas na matrizharv_stan
é igual ao comprimento do vetor harv_stan_value
, podemos escrever uma expressão para retornar um valor lógico (ou TRUE
ou FALSE
):
dim(harv_stan)[1] == length(harv_stan_value)
Lembre-se de que o operador ==
denota "é igual a". Como o número de linhas em harv_stan
é igual ao comprimento de harv_stan_value
, a saída dessa expressão é:
Vamos escrever uma expressão para confirmar que o vetor value
bate com o mesmo comprimento da matriz uni_matrix
.
Vamos aos exercícios:
- Escreva uma expressão para retornar
TRUE
se o número de linhasuni_matrix
for igual ao comprimento devalue
.
Agora que confirmamos que o vetorvalue
tem o mesmo comprimento que o número de linhas da matrizuni_matrix
, podemos adicioná-lo à matriz como uma coluna.
Anteriormente neste artigo, usamos a funçãorbind()
para combinar os vetores das classificações da universidade em uma única matriz. As funções rbind()
combinam vetores ou matrizes por linha.
Para adicionar um vetor a uma matriz como uma coluna ou unir duas matrizes por coluna, usaremos a função cbind()
. A funçãocbind()
combina vetores ou matrizes por coluna.
Vamos adicionar dados de valor à nossa matriz de exemplo que contém apenas rankings de Harvard e Stanford. Para adicionar o vetorharv_stan_value
à matriz harv_stan
como uma nova coluna, escreveríamos:
cbind(harv_stan,harv_stan_value)
A matriz resultante contém classificações para Harvard e Stanford, bem como informações sobre matrícula para as duas escolas:
Vamos aos exercícios:
- Adicione o vetor
value
como uma nova coluna parauni_matrix
. - Salve a nova matriz contendo rankings e mensalidades para cada universidade como
complete_matrix
.
Anteriormente nos artigos, aprendemos a indexar vetores para extrair elementos específicos. Nós também podemos indexar matrizes. Como são objetos bidimensionais, podemos:
- Criar um índice para selecionar valores específicos
- Criar um índice para selecionar linhas ou colunas
Vamos ver a matrizharv_stan
como um exemplo:
Vamos dizer que queremos extrair o ranking patents
para Stanford. Como as matrizes são bidimensionais, precisaremos especificar a localização do elemento que queremos extrair em termos de sua linha e sua coluna. Nesta matriz, Stanford
é a linha 2 e patents
é a coluna 5.
A sintaxe para indexar matrizes é semelhante à indexação dos vetores. Você usará colchetes para especificar posições de linha e coluna que definem o local do elemento que você deseja extrair.
Para indexar harv_stan
para extrair o ranking de patentes de Stanford, podemos indexar por posições de linha (2) e coluna (5):
harv_stan[2, 5]
Observe que, como na saída da função dim()
, a linha sempre vem antes da coluna para as operações de indexação.
Também podemos indexar matrizes por nomes de linhas e colunas em vez de posições:
harv_stan["stanford", "patents"]
Ao indexar por nome, lembre-se de colocar os nomes das linhas e colunas entre aspas.
E se você quiser selecionar mais de um elemento de uma matriz? Vamos indexar para selecionar broad_impact
e patents
para Harvard e Stanford.
Como as colunas broad_impact
e patents
estão próximas uma da outra na matriz, podemos especificar o intervalo de colunas ( 4:5
) em sua sintaxe de indexação:
harv_stan[2, 4:5]
Também podemos indexar matrizes para extrair elementos que não estão próximos uns dos outros. Digamos que estamos interessados em extrair world_rank
e influence
para Harvard e Stanford.
Nesse caso, usaremos c()
para especificar vetores contendo as linhas e colunas em nossa sintaxe de indexação:
harv_stan [ c ( 1 , 2 ), c ( 1 , 3 )]
Como foi o caso da extração de elementos únicos, também podemos indexar para extrair vários elementos usando nomes em vez de posições:
harv_stan[c("harvard", "stanford"), c("world_rank", "influence")]
Vamos aos exercícios:
Indexar por atributos de nome para extrair os seguintes valores de complete_matrix
:
- Classificação de influência de Oxford -> Armazene a saída como
oxford_influence
- Patentes de Cambridge e Stanford -> Armazene a saída como
cam_stan_patents
Agora podemos extrair subconjuntos de valores das matrizes. Em alguns casos, no entanto, faz sentido indexar uma matriz para extrair linhas ou colunas inteiras, como todas as classificações de uma determinada universidade.
Por exemplo, vamos indexar harv_stan
para extrair todos os rankings de Harvard. Todos os rankings de Harvard estão na linha 1 da nossa matriz. Para indicar que queremos indexar para extrair todos os elementos na linha 1, deixe a posição da coluna na expressão de indexação em branco:
harv_stan["harvard",]
Se quisermos selecionar os rankings de qualidade da educação para cada universidade em nossa matriz, indexaremos para selecionar todos os elementos nessa coluna (coluna 2).
Quando escrevemos uma expressão para extrair uma linha ou coluna inteira de uma matriz, precisamos especificar apenas o nome dessa linha ou coluna. A outra posição na expressão é deixada em branco. Como o número da coluna sempre vem depois do número da linha, nós escreveríamos:
harv_stan [, "quality_of_education" ]
Podemos indexar para selecionar várias linhas e colunas de uma matriz.
Para selecionar os rankingsquality_of_education
, influence
e broad_impact
para todas as universidades, indexaríamos por essas colunas.
Podemos escrever uma expressão para especificar a seleção das colunas usando c()
:
harv_stan [, c ( "quality_of_education" , "influence" , "broad_impact" )]
Note que, desde que selecionamos colunas, c("quality_of_education", "influence", "broad_impact")
vem depois da vírgula. Se estivéssemos indexando para selecionar várias linhas, elas viriam antes da vírgula.
Vamos aos exercícios:
Indexe a matrizcomplete_matrix
para extrair o seguinte:
- Classificação de Oxford -> Armazene a saída como
oxford_rank
- Posições de influência para todas as universidades -> Armazene a saída como
influence
- Todos os rankings de Harvard e do MIT -> Armazene a saída como
harv_mit_rank
- Influência e classificação de patentes para todas as universidades -> Armazene a saída como
influence_patents
Agora que aprendemos a combinar vetores em matrizes e a extrair elementos, voltemos ao nosso objetivo inicial: Analisando os dados do ranking da universidade para decidir sobre em qual universidade entrar.
Para responder a esta pergunta, vamos desenvolver uma pontuação para cada universidade que seja um agregado das informações de rankings e de ensino disponíveis em complete_matrix
. Vamos classificar as universidades para cada categoria que temos dados: world_rank
, quality_of_education
, influence
, broad_impact
, patents
, e tuition
.
Então, podemos calcular uma pontuação para cada universidade a partir da soma de suas classificações.
Vamos classificar cada universidade em relação a outras no conjunto de dados.
complete_matrix
Usaremos a funçãorank()
, juntamente com uma expressão que indexa a matriz, para especificar a categoria pela qual queremos classificar as universidades. A funçãorank()
retorna um vetor de valores numéricos. Por exemplo, para classificar as universidades por quality_of_education
, nós escrevemos:
rank ( complete_matrix [, "quality_of_education" ])
Vamos aos exercícios:
Vamos classificar as universidades em complete_matrix
em cada categoria e salvar cada classificação para cada categoria como um novo vetor.
Use rank()
para classificar as universidades para cada uma das seguintes categorias:
world_rank
quality_of_education
influence
broad_impact
patents
value
Salve os vetores de classificação gerados para cada categoria com os seguintes nomes:
world_rank_rank
quality_of_education_rank
influence_rank
broad_impact_rank
patents_rank
value_rank
Agora que classificamos as seis universidades em cada categoria, vamos combinar os vetores que contêm as classificações em uma única matriz ( ranks_matrix
) usando rbind()
:
ranks_matrix <- rbind ( world_rank_rank , quality_of_education_rank , influence_rank , broad_impact_rank , patents_rank , value_rank )
Observe que, como usamos rbind()
, combinamos os vetores por linhas. A nova matriz contém os vetores para cada categoria empilhada uma sobre a outra. Os rankings de cada universidade estão em uma coluna diferente.
Agora, podemos calcular uma pontuação para cada universidade. Scores menores indicam classificações mais altas. Vamos supor que valorizemos todas as categorias em nossa seleção universitária igualmente. Em cursos futuros, aprenderemos o que fazer se, digamos, a matrícula baixa for mais importante para você do que a classificação de uma universidade para gerar patentes.
Para calcular uma pontuação agregada para cada universidade, vamos calcular a soma de suas classificações em todas as categorias. Usaremos a indexação para especificar a coluna da universidade que queremos calcular uma pontuação para usar sum()
.
Por exemplo, vamos calcular a soma dos rankings de Harvard:
sum ( ranks_matrix [, "harvard" ])
Como os rankings das universidades são organizados em colunas na matrizranks_matrix
, colocamos harvard
após a vírgula na expressão de indexação.
Vamos aos exercícios:
Vamos calcular uma pontuação para cada universidade, tomando a soma de seus rankings em cada categoria da matrizranks_matrix
.
Calcule as somas das classificações de cada universidade em ranks_matrix
:
harvard
stanford
mit
cambridge
oxford
columbia
Neste artigo, analisamos os dados para responder a uma pergunta: Em que universidade você deveria entrar? Como você praticou o trabalho com dados armazenados em matrizes e vetores, você também adquiriu experiência em pensar em maneiras de manipular dados para responder a perguntas. Vamos nos basear nessas habilidades à medida que nos aprofundamos na análise durante o restante do curso.
Vamos rever o que aprendemos com nossa análise. Calculamos as pontuações agregadas de classificação para cada universidade:
sum(ranks_matrix[,"harvard"])
# 8
sum(ranks_matrix[,"stanford"])
# 20
sum(ranks_matrix[,"mit"])
# 15
sum(ranks_matrix[,"cambridge"])
# 27
sum(ranks_matrix[,"oxford"])
# 24
sum(ranks_matrix[,"columbia"])
# 32
Com base em nossa análise, Harvard obtém a pontuação máxima. Digamos que você decida se inscrever lá.
Neste link, você encontrará um resumo do que aprendeu até agora: Uma lista útil de “tópicos” para os quais você deve pegar como base ao continuar aprendendo R.
No próximo artigo, trabalharemos com listas, outra das estruturas de dados do R, para nos ajudar a organizar sua pesquisa sobre os clubes para ingressar na sua nova universidade.
E não esqueça, a partir desse semestre, iremos promover 3 cursos gratuitos sobre R, sendo eles Introdutório, Intermediário e Avançado. :) As datas já foram divulgadas e as inscrições serão abertas no dia 01 de agosto no sympla.com.br/rladiesbh.
Acompanhem nossas redes: