Função Matrix em R: Criar, Imprimir, adicionar Coluna e Fatia
⚡ Resumo Inteligente
Uma matriz em R é um array bidimensional que armazena um único tipo de dado em m linhas e n colunas, construído com matrix(), estendido com cbind() e rbind(), e acessado por meio de colchetes.
Função matricial em R
Uma função de matriz em R é uma matriz bidimensional que possui um número m de linhas e um número n de colunas. Em outras palavras, matriz na programação R é uma combinação de dois ou mais vetores com o mesmo tipo de dados.
Em essência, uma matriz é simplesmente um vetor que carrega um atributo `dim` de comprimento dois. É por isso que cada elemento deve compartilhar um tipo: no momento em que um valor de caractere se junta a números, toda a matriz é convertida para caractere. O R armazena os valores em uma única coluna e usa `dim` para decidir onde cada linha termina, portanto a escolha de tipo de dados Aplica-se ao objeto inteiro de uma só vez.
Observação: A função `matrix()` sempre retorna exatamente duas dimensões. Para construir uma estrutura com três ou mais dimensões em R, use `array()` com um vetor de dimensões ou atribua um valor a `dim()` diretamente. O diagrama abaixo mostra o layout de linhas e colunas que toda matriz segue.
Como criar uma matriz em R
Podemos criar uma matriz com a função matriz()A assinatura base do R aceita cinco argumentos, e os três mais usados são mostrados aqui:
matrix(data, nrow, ncol, byrow = FALSE)
Argumentos:
- dados,: O conjunto de elementos que o R organizará nas linhas e colunas da matriz.
- agoraNúmero de linhas.
- ncolNúmero de colunas.
- por linha: Um indicador lógico. Com o valor padrão byrow = FALSE, a matriz é preenchida coluna por coluna, de cima para baixo. Com byrow = TRUE, ela é preenchida linha por linha, da esquerda para a direita.
- nomes de dimensões: Uma lista opcional de comprimento dois, fornecendo os nomes das linhas e os nomes das colunas.
Antes do primeiro exemplo, é importante conhecer dois detalhes da documentação básica do R. Se apenas um dos parâmetros `nrow` e `ncol` for fornecido, o R infere o outro a partir do comprimento dos dados. Além disso, se os dados contiverem poucos elementos para preencher o formato desejado, os valores serão reutilizados em vez de descartados.
Vamos construir duas matrizes 5×2 a partir da sequência de números de 1 a 10, uma com byrow = TRUE e outra com byrow = FALSE, para ver a diferença.
# Construct a matrix with 5 rows that contain the numbers 1 up to 10 and byrow = TRUE matrix_a <-matrix(1:10, byrow = TRUE, nrow = 5) matrix_a
Saída:
Como foi usado o parâmetro `byrow = TRUE`, o console preenche a primeira linha com 1 e 2, a segunda linha com 3 e 4, e assim por diante.
Imprima a dimensão da matriz_a com dim()
Agora, vamos imprimir a dimensão da matriz em R com dim(). A sintaxe para imprimir matriz em R usando dim() é:
# Print dimension of the matrix with dim()
dim(matrix_a)
Saída:
## [1] 5 2
A função dim() retorna primeiro a contagem de linhas e depois a contagem de colunas, confirmando o formato 5×2.
Preencher uma matriz por coluna com byrow = FALSE
Os mesmos dez números e a mesma linha produzem um arranjo diferente quando a direção do preenchimento muda.ping Por padrão, a função `byrow` envia os valores para a primeira coluna antes do início da segunda.
# Construct a matrix with 5 rows that contain the numbers 1 up to 10 and byrow = FALSE matrix_b <-matrix(1:10, byrow = FALSE, nrow = 5) matrix_b
Saída:
Imprima a dimensão da matriz_b com dim()
Novamente, imprima a dimensão da matriz usando dim(). Abaixo está uma sintaxe da dimensão da matriz de impressão R:
# Print dimension of the matrix with dim()
dim(matrix_b)
Saída:
## [1] 5 2
O formato permanece inalterado em 5×2, porque o byrow altera a ordem de preenchimento e nunca as dimensões.
ObservaçãoUsar o comando matrix_b <-matrix(1:10, byrow = FALSE, ncol = 2) terá o mesmo efeito que acima, já que R infere nrow = 5 a partir dos dez valores fornecidos.
Você também pode criar uma matriz 4×3 usando `ncol`. O R criará 3 colunas e preencherá cada coluna de cima para baixo. Veja um exemplo.
matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)
matrix_c
Saída:
## [,1] [,2] [,3] ## [1,] 1 5 9 ## [2,] 2 6 10 ## [3,] 3 7 11 ## [4,] 4 8 12
Os cabeçalhos de coluna [,1] a [,3] e os rótulos de linha [1,] a [4,] são marcadores de posição padrão do R. Eles desaparecem assim que nomes de dimensões reais são fornecidos, como mostrado posteriormente neste tutorial.
Exemplo:
dim(matrix_c)
Saída:
## [1] 4 3
Adicione uma coluna a uma matriz com cbind()
Você pode adicionar colunas a uma matriz em R com o comando `cbind()`. `cbind()` significa "agrupamento de colunas" e pode concatenar quantas matrizes ou colunas forem especificadas. Por exemplo, no exemplo anterior, criamos uma matriz 5×2. Concatenamos uma terceira coluna e verificamos se a dimensão é 5×3.
Exemplo:
# concatenate c(1:5) to the matrix_a matrix_a1 <- cbind(matrix_a, c(1:5)) # Check the dimension dim(matrix_a1)
Saída:
## [1] 5 3
Exemplo:
matrix_a1
saída
## [,1] [,2] [,3] ## [1,] 1 2 1 ## [2,] 3 4 2 ## [3,] 5 6 3 ## [4,] 7 8 4 ## [5,] 9 10 5
Exemplo:
Também podemos vincular mais de uma coluna por vez. O próximo bloco constrói a matriz_a2, uma matriz 4×3 contendo os números de 13 a 24, para que possa ser unida à matriz_c, também 4×3, produzindo um resultado 4×6 que abrange os números de 1 a 24.
matrix_a2 <-matrix(13:24, byrow = FALSE, ncol = 3)
Saída:
## [,1] [,2] [,3] ## [1,] 13 17 21 ## [2,] 14 18 22 ## [3,] 15 19 23 ## [4,] 16 20 24
Exemplo:
matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)
matrix_d <- cbind(matrix_a2, matrix_c)
dim(matrix_d)
Saída:
## [1] 4 6
NOTAPara que a função `cbind()` funcione, o número de linhas das matrizes em R deve ser igual. Quando os números são diferentes, R reutiliza a entrada menor ou gera um erro; portanto, verificar `dim()` em ambos os objetos primeiro é a prática mais segura.
Enquanto cbind() concatena colunas, rbind() anexa linhas. Vamos adicionar uma linha à nossa matriz matrix_c e verificar se a dimensão é 5×3.
matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3) # Create a vector of 3 columns add_row <- c(1:3) # Append to the matrix matrix_c <- rbind(matrix_c, add_row) # Check the dimension dim(matrix_c)
Saída:
## [1] 5 3
Observe que a vinculação de um vetor nomeado, como add_row, também atribui esse nome à nova linha, o que é o primeiro passo para as matrizes rotuladas que serão abordadas mais adiante.
Fatie uma matriz
Podemos selecionar um ou vários elementos de uma matriz em Programação R usando colchetes [ ]. Dentro dos colchetes, o seletor de linha vem primeiro e o seletor de coluna em segundo, separados por vírgula. É aqui que o fatiamento entra em cena.
Por exemplo:
- matriz_c[1,2] seleciona o elemento na primeira linha e na segunda coluna.
- matrix_c[1:3,2:3] resulta em uma matriz de fatiamento R com os dados nas linhas 1, 2, 3 e colunas 2 e 3.
- matriz_c[,1] seleciona todos os elementos da primeira coluna.
- matriz_c[1,] seleciona todos os elementos da primeira linha.
Deixar um lado da vírgula em branco significa, portanto, incluir todos os valores desse lado. Uma consequência que pega os iniciantes desprevenidos: quando uma única linha ou coluna é selecionada, o R descarta a dimensão vazia e retorna um vetor simples. Adicionar `drop = FALSE`, como em `matrix_c[1, , drop = FALSE]`, mantém o resultado como uma matriz.
Aqui está a saída que você obtém para os códigos acima
Nomeie as linhas e colunas de uma matriz em R.
Rótulos padrão como [,1] e [3,] dificultam a leitura da saída assim que uma matriz passa a conter significado real. O argumento dimnames e as funções de substituição rownames() e colnames() adicionam rótulos de texto que acompanham a matriz em cbind(), t() e em todas as operações de fatiamento.
# Name the rows and columns while the matrix is built sales <- matrix(1:6, nrow = 2, ncol = 3, dimnames = list(c('north', 'south'), c('q1', 'q2', 'q3'))) # Or attach the names afterwards rownames(sales) <- c('north', 'south') colnames(sales) <- c('q1', 'q2', 'q3') # Read the names back as a list of two character vectors dimnames(sales) # Names make label based slicing possible sales['north', 'q2']
| função | Lê | Conjuntos |
|---|---|---|
| dimnames(m) | Ambas as dimensões como uma lista de dois vetores | dimnames(m) <- list(linhas, colunas) |
| nomes_linha(m) | Os rótulos das linhas | nomes_de_linhas(m) <- linhas |
| colnames(m) | Os rótulos das colunas | colnames(m) <- cols |
| dim(m) | Linhas e colunas como dois números inteiros | dim(m) <- c(nrow, ncol) |
Uma vez que os rótulos existam, `sales['north', 'q2']` é muito mais claro do que `sales[1, 2]` e sobrevive a uma reordenação das linhas. Definir um componente `dimnames` como NULL remove esse conjunto de rótulos novamente, e uma matriz convertida com `as.data.frame()` carrega seus nomes de linha e coluna diretamente para o `data.frame`. quadro de dados.
Matriz OperaOperações em R: Aritmética, Transposição e Multiplicação
A aritmética com matrizes é onde a regra de tipo único se mostra vantajosa. O R base lida com todo o conjunto sem a necessidade de um pacote adicional, mas dois operadores são fáceis de confundir: * multiplica elemento por elemento, enquanto %*% realiza a multiplicação de matrizes propriamente dita e exige que as colunas do operando da esquerda correspondam às linhas do operando da direita.
m1 <- matrix(1:4, nrow = 2) m2 <- matrix(5:8, nrow = 2) m1 + m2 # element by element addition m1 * m2 # element by element product, NOT matrix multiplication m1 %*% m2 # true matrix multiplication t(m1) # transpose: rows become columns solve(m1) # inverse, for a square matrix that is not singular rowSums(m1) # one total per row colMeans(m1) # one mean per column apply(m1, 1, max) # any function, applied row by row
- t(m)Transpõe a matriz, de modo que o elemento [i, j] se torna [j, i]. Os nomes das dimensões são mantidos.
- resolver(m): Retorna a inversa de uma matriz quadrada não singular e solve(a, b) resolve um sistema linear.
- somas_linhas / somas_colunas / médias_linhas / médias_colunasDocumentado como equivalente a apply() com sum ou mean, mas muito mais rápido.
- aplicar(m, MARGEM, FUN)MARGIN = 1 percorre as linhas e MARGIN = 2 percorre as colunas, para qualquer função que você fornecer.
- diagnóstico, detecção, produção cruzada: Diagonal, determinante e a forma mais rápida de t(x) %*% y.
Como essas operações são vetorizadas, elas substituem os loops em vez de ficarem dentro deles. Um resumo que exigiria um loop for aninhado em milhares de células torna-se uma única chamada de colMeans(), o que faz diferença à medida que os dados aumentam.
Matriz vs. Data Frame vs. Array em R
Matrizes, data frames e arrays parecem retangulares no console, mas respondem a perguntas diferentes. A tabela os exibe lado a lado.
| Propriedade | Matriz | Quadro de dados | Ordem |
|---|---|---|---|
| Dimensões | Exatamente 2 | Exatamente 2 | Qualquer número |
| Tipos de coluna | Um tipo para todo o objeto | Um tipo diferente por coluna | Um tipo para todo o objeto |
| Construído com | matriz() | data.frame() | array () |
| Uso típico | Computação numérica e álgebra linear | Dados observacionais mistos | Tabelas empilhadas, como contagens por ano. |
| Rótulos de linha | nomes de dimensões opcionais | Os nomes das linhas estão sempre presentes. | nomes de dimensões opcionais |
# A matrix holds one type only, so mixing coerces everything to character mixed <- matrix(c(1, 2, 'a', 'b'), nrow = 2) class(mixed[1, 1]) # Convert between the structures as.data.frame(matrix_c) as.matrix(mtcars) # A matrix is the two dimensional case of an array is.matrix(matrix_c) inherits(matrix_c, 'array')
Recorra a uma matriz quando todas as células contiverem o mesmo tipo de número e o trabalho for aritmético. Recorra a uma quadro de dados quando as colunas contêm tipos diferentes, por exemplo, um nome de caractere ao lado de um preço numérico e um fator. Alcance um Lista quando as partes têm comprimentos diferentes, e para um array quando um terceiro índice, como tempo ou região, realmente existe. A conversão em ambas as direções é barata com as.matrix() e as.data.frame(), então a estrutura pode seguir a tarefa em vez do contrário.





