Trabalhando com Matrizes

Layla Comparin
rladiesbh

--

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 harvarde stanfordusando 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 MITao vetorharv_stancomo 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_matrixdesses 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_matrixuso do vetorcategories.

Agora que o exercício acima foi feito, a matrizuni_matrixtem 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 vetorvaluea matriz uni_matrixcomo 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_stanpossui 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_valuecomo uma nova coluna à matrizharv_stan, queremos que o comprimento de harv_stan_valueseja 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 TRUEou 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 TRUEse o número de linhas uni_matrixfor igual ao comprimento de value.

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 vetorvalue como uma nova coluna para uni_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 patentspara 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_stanpara 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_impacte patentspara Harvard e Stanford.

Como as colunas broad_impacte patentsestã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_ranke influencepara 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_stanpara 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, influencee broad_impactpara 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_matrixpara 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_matrixem 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:

https://www.instagram.com/rladiesbh/

https://twitter.com/rladiesbh

https://www.facebook.com/rladiesbh

--

--

Layla Comparin
rladiesbh

Engenheira de Dados por profissão, confeiteira e dançarina por amor ♥️