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.

  • 🧩 Estrutura: Uma matriz é um vetor com um atributo de dimensão, portanto, cada célula deve compartilhar um tipo de dado.
  • 🛠️ Criação: matrix(data, nrow, ncol, byrow) organiza uma sequência e o R infere a dimensão faltante.
  • 🔄 Preencher o pedido: byrow = FALSE preenche coluna por coluna, enquanto byrow = TRUE preenche linha por linha.
  • Crescimento: A função cbind() anexa colunas e a função rbind() anexa linhas, desde que a dimensão compartilhada corresponda.
  • Fatiamento: m[linha, coluna] lê as linhas primeiro, e um lado em branco seleciona tudo daquele lado.
  • 🏷️ Rótulos: dimnames, rownames() e colnames() substituem os marcadores [,1] por nomes legíveis.
  • ➕➖ Aritmética: O asterisco multiplica elemento por elemento, enquanto %*% realiza a multiplicação de matrizes.

Funções matriciais em R: Criar, Imprimir, Adicionar Coluna e Fatiar

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.

Layout de linhas e colunas de uma função matricial em R

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.

Saída do console da matriz_a preenchida linha por linha com byrow = TRUE

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:

Saída do console da matriz_b preenchida coluna por coluna com byrow = FALSE

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

Resultados da visualização no console das quatro expressões de fatiamento de matriz em R.

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

Perguntas Frequentes

O R recicla os valores em vez de rejeitá-los, portanto, `matrix(1:3, nrow = 2, ncol = 3)` repete a sequência. Um aviso aparece apenas quando o comprimento não é um múltiplo exato da contagem de células, o que torna a reciclagem silenciosa um bug fácil de passar despercebido.

Use um índice negativo: m[-2, ] remove a segunda linha e m[, -3] remove a terceira coluna. Vários podem ser removidos simultaneamente com m[-c(1, 4), ]. O objeto original permanece inalterado até que você atribua o resultado de volta.

Selecionar uma única linha ou coluna descarta a dimensão vazia por padrão. Adicione `drop = FALSE`, como em `m[1, , drop = FALSE]`, para manter uma matriz de uma única linha. Isso é importante quando o resultado é passado para uma função que espera duas dimensões.

A função `which(m == value, arr.ind = TRUE)` retorna um resultado de duas colunas, indicando a linha e a coluna de cada correspondência. Sem `arr.ind`, a resposta é um único índice linear percorrendo as colunas, o que raramente é desejado.

Use array(data, dim = c(rows, columns, layers)) ou atribua dim(x) diretamente a um vetor. O fatiamento então utiliza um índice por dimensão, como a[2, 3, 1]. Uma matriz é simplesmente o caso bidimensional de um array.

Sim. A documentação básica do R afirma que `rowSums` e `colMeans` são equivalentes a `apply()` com `sum` ou `mean`, mas muito mais rápidos, e ambos são superiores a um loop `for` explícito porque a iteração ocorre no código compilado em vez de no interpretador.

O ajuste de modelos é álgebra linear: as características formam uma matriz, os coeficientes formam um vetor e a previsão é um único produto %*%. Muitos aprendizado de máquina Portanto, os pacotes exigem uma matriz numérica em vez de um quadro de dados como entrada.

Sim. Travas deslizantes portáteis Copiloto do GitHub Executa no RStudio 2023.09.0 e versões posteriores e completa o código a partir dos comentários no arquivo aberto. Verifique sua lógica de dimensão em RStudio, porque uma linha incorreta ainda produz uma matriz válida.

Resuma esta postagem com: