Функція матриці в R: створення, друк, додавання стовпців і фрагментів

⚡ Розумний підсумок

Матриця в R — це двовимірний масив, який містить один тип даних у m рядках та n стовпцях, побудований за допомогою matrix(), розширений за допомогою cbind() та rbind() та доступний через квадратні дужки.

  • 🧩 Структура: Матриця — це вектор з атрибутом dim, тому кожна комірка повинна мати один спільний тип даних.
  • 🛠️ Створення: matrix(data, nrow, ncol, byrow) упорядковує послідовність, а R визначає відсутній вимір.
  • 🔄 Порядок виконання: byrow = FALSE заповнює стовпець за стовпцем, тоді як byrow = TRUE заповнює рядок за рядком.
  • Зростання: cbind() додає стовпці, а rbind() додає рядки, за умови збігу спільного виміру.
  • Нарізка: m[рядок, стовпець] спочатку зчитує рядки, а порожня сторона вибирає все на цій стороні.
  • 🏷️ Мітки: Функції dimnames, rownames() та colnames() замінюють заповнювачі [,1] на читабельні імена.
  • ➕➖ Арифметика: Зірочка множить елемент на елемент, тоді як %*% виконує множення матриць.

Матрична функція в R Create Print, додавання стовпця та зрізу

Матрична функція в R

Матрична функція в R — це двовимірний масив, який має m рядків і n стовпців. Іншими словами, матриця в програмуванні R — це комбінація двох або більше векторів з однаковим типом даних.

Нижче, матриця — це просто вектор, що містить атрибут dim довжини два. Ось чому кожен елемент повинен мати один спільний тип: у момент, коли символьне значення з'єднується з числами, вся матриця перетворюється на символьне. R зберігає значення в одному стовпцевому циклі та використовує dim, щоб визначити, де закінчується кожен рядок, тому вибір тип даних застосовується до всього об'єкта одночасно.

Примітка: Сама matrix() завжди повертає рівно два виміри. Щоб побудувати структуру з трьома або більше вимірами в R, використовуйте array() з вектором dim або призначте dim() безпосередньо. На діаграмі нижче показано розташування рядків і стовпців, якого дотримується кожна матриця.

Розташування матричної функції в R у рядках та стовпцях

Як створити матрицю в R

Ми можемо створити матрицю за допомогою функції матриця()Базовий підпис R приймає п'ять аргументів, і три з них, що використовуються найчастіше, наведено тут:

matrix(data, nrow, ncol, byrow = FALSE)

аргументи:

  • дані: Колекція елементів, які R розташує по рядках і стовпцях матриці.
  • нуруватиКількість рядків.
  • колКількість стовпців.
  • byrowЛогічний прапорець. Якщо byrow = FALSE, матриця заповнюється стовпець за стовпцем, зверху вниз. Якщо byrow = TRUE, матриця заповнюється рядок за рядком, зліва направо.
  • імена розмірів: Необов'язковий список довжиною два, що містить назви рядків та назви стовпців.

Перш ніж розглянути перший приклад, варто знати дві деталі з базового посібника R. Якщо задано лише одне з nrow та ncol, R визначає інше на основі довжини даних. А якщо дані містять занадто мало елементів, щоб заповнити запитувану вами форму, значення переробляються, а не відхиляються.

Давайте побудуємо дві матриці 5×2 з послідовності чисел від 1 до 10, одну з byrow = TRUE, а іншу з byrow = FALSE, щоб побачити різницю.

# 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

вихід:

Оскільки було використано byrow = TRUE, консоль заповнює перший рядок числами 1 та 2, другий рядок – 3 та 4 тощо.

Консольний вивід матриці matrix_a, заповненої рядок за рядком з byrow = TRUE

Тепер давайте надрукуємо розмірність матриці в R за допомогою dim(). Синтаксис для друку матриці в R за допомогою dim() такий:

# Print dimension of the matrix with dim()
dim(matrix_a)

вихід:

## [1] 5 2

dim() спочатку повертає кількість рядків, а потім кількість стовпців, підтверджуючи фігуру 5×2.

Заповнити матрицю по стовпцях з byrow = FALSE

Ті самі десять чисел і той самий рядок створюють різне розташування, коли напрямок заповнення змінюється. Зберігайтеping byrow за замовчуванням надсилає значення вниз по першому стовпцю перед початком другого.

# 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

вихід:

Консольний вивід matrix_b, заповнений стовпчик за стовпчиком з byrow = FALSE

Знову надрукуйте розмірність матриці за допомогою dim(). Нижче наведено синтаксис розмірності матриці друку R:

# Print dimension of the matrix with dim()
dim(matrix_b)

вихід:

## [1] 5 2

Форма не змінюється при розмірі 5×2, оскільки byrow змінює порядок заповнення, а не розміри.

Примітка:Використання команди matrix_b <-matrix(1:10, byrow = FALSE, ncol = 2) матиме той самий ефект, що й вище, оскільки R визначає nrow = 5 з десяти наданих значень.

Ви також можете створити матрицю 4×3 за допомогою ncol. R створить 3 стовпці та заповнить кожен стовпець зверху вниз. Перегляньте приклад

matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)
matrix_c

вихід:

##       [,1] [,2] [,3]
## [1,]    1    5    9
## [2,]    2    6   10
## [3,]    3    7   11
## [4,]    4    8   12

Заголовки стовпців [,1] - [,3] та підписи рядків [1] - [4] є за замовчуванням заповнювачами R. Вони зникають, щойно надаються справжні назви розмірів, як показано далі в цьому посібнику.

приклад:

dim(matrix_c)

вихід:

## [1] 4 3

Додайте стовпець до матриці за допомогою cbind()

Ви можете додати стовпець до матриці R за допомогою команди cbind(). cbind() означає зв'язування стовпців і може об'єднати будь-яку кількість матриць або стовпців, яку вказано. Наприклад, у нашому попередньому прикладі було створено матрицю 5×2. Ми об'єднуємо третій стовпець і перевіряємо, чи розмірність дорівнює 5×3.

приклад:

# concatenate c(1:5) to the matrix_a
matrix_a1 <- cbind(matrix_a, c(1:5))
# Check the dimension
dim(matrix_a1)

вихід:

## [1] 5 3

приклад:

matrix_a1

Вихід

##       [,1] [,2] [,3]
## [1,]    1    2    1
## [2,]    3    4    2
## [3,]    5    6    3
## [4,]    7    8    4
## [5,]    9   10    5

приклад:

Ми також можемо зв'язати більше одного стовпця одночасно. Наступний блок будує matrix_a2, матрицю 4×3, яка містить числа від 13 до 24, щоб її можна було об'єднати з matrix_c 4×3 для отримання результату 4×6, що охоплює числа від 1 до 24.

matrix_a2 <-matrix(13:24, byrow = FALSE, ncol = 3)

вихід:

##      [,1] [,2] [,3]
## [1,]   13   17   21
## [2,]   14   18   22
## [3,]   15   19   23
## [4,]   16   20   24

приклад:

matrix_c <-matrix(1:12, byrow = FALSE, ncol = 3)		
matrix_d <- cbind(matrix_a2, matrix_c)
dim(matrix_d)

вихід:

## [1] 4 6

ПРИМІТКАКількість рядків матриць у R має бути однаковою для роботи cbind(). Коли вони відрізняються, R або переробляє коротший вхідний рядок, або викликає помилку, тому безпечніше спочатку перевірити dim() на обох об'єктах.

Там, де cbind() об'єднує стовпці, rbind() додає рядки. Додамо один рядок до нашої матриці matrix_c та перевіримо, що розмірність дорівнює 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)

вихід:

## [1] 5 3

Зверніть увагу, що зв'язування іменованого вектора, такого як add_row, також надає новому рядку цю назву, що є першим кроком до позначених матриць, розглянутих далі.

Розрізати матрицю

Ми можемо вибрати один або декілька елементів з матриці R програмування за допомогою квадратних дужок []. Усередині дужок селектор рядка йде першим, а селектор стовпця другим, розділені комою. Саме тут і стає в пригоді зрізання.

Наприклад:

  • matrix_c[1,2] вибирає елемент у першому рядку та другому стовпці.
  • matrix_c[1:3,2:3] створює матрицю зрізів R з даними в рядках 1, 2, 3 та стовпцях 2 та 3.
  • matrix_c[,1] вибирає всі елементи першого стовпця.
  • matrix_c[1,] вибирає всі елементи першого рядка.

Таким чином, якщо залишити один бік коми порожнім, це означає кожне значення з цього боку. Один наслідок підводить новачків: коли вибрано один рядок або стовпець, R відкидає порожній вимір і повертає простий вектор. Додавання drop = FALSE, як у matrix_c[1, , drop = FALSE], зберігає результат у вигляді матриці.

Ось результат, який ви отримуєте для наведених вище кодів

Результати консолі для чотирьох виразів розрізання матриці в R

Назвіть рядки та стовпці матриці в R

Такі стандартні мітки, як [,1] та [3,], ускладнюють читання виводу, щойно матриця має реальне значення. Аргумент dimnames та функції заміни rownames() та colnames() додають текстові мітки, які потім передаються разом із матрицею через cbind(), t() та кожну операцію зрізання.

# 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']
функція Читає набори
розміри_імен(м) Обидва виміри як список двох векторів dimnames(m) <- список(рядки, стовпці)
назви рядків(м) Мітки рядків назви рядків(m) <- рядки
назви колонок (м) Мітки стовпців назви стовпців(м) <- стовпці
розмір (м) Рядки та стовпці як два цілі числа dim(m) <- c(nrow, ncol)

Після того, як мітки існують, sales['north', 'q2'] набагато зрозуміліший, ніж sales[1, 2], і витримує переупорядкування рядків. Встановлення компонента dimnames на NULL знову видаляє цей набір міток, і матриця, перетворена за допомогою as.data.frame(), переносить свої назви рядків і стовпців безпосередньо в кадр даних.

Матриця Operaції в R: арифметика, транспонування та множення

Арифметика матриць – це те, де правило одного типу виправдовує себе. Base R обробляє всю множину без додаткового пакету, але два оператори легко сплутати: * множить елемент на елемент, тоді як %*% виконує справжнє множення матриць і вимагає, щоб стовпці лівого операнда збігалися з рядками правого.

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(м)Транспонує матрицю, таким чином елемент [i, j] стає [j, i]. Імена розмірностей переносяться.
  • розв'язати(м)Повертає обернену квадратну, несингулярну матрицю, а solve(a, b) розв'язує лінійну систему.
  • Суми_рядків / Суми_колонок / Середні_рядки / Середні_колонкиЗадокументовано як еквівалент apply() із sum або mean, але значно швидше.
  • застосувати(м, МАРТИНГ, РОЗВАГА)MARGIN = 1 обходить рядки, а MARGIN = 2 — стовпці для будь-якої наданої функції.
  • діагностика, деталізація, перехресне виробництвоДіагональ, визначник та швидша форма t(x) %*% y.

Оскільки ці операції векторизовані, вони замінюють цикли, а не знаходяться всередині них. Підсумок, який би потребував вкладеного циклу for для тисяч комірок, перетворюється на один виклик colMeans(), що стає важливим, щойно дані зростають.

Матриця проти кадру даних проти масиву в R

Матриці, фрейми даних та масиви виглядають прямокутними в консолі, проте вони відповідають на різні запитання. У таблиці вони розташовані поруч.

властивість Матриця Фрейм даних масив
розміри Рівно 2 Рівно 2 Будь-яке число
Типи стовпців Один тип для всього об'єкта Різний тип для кожного стовпця Один тип для всього об'єкта
Побудований с матриця() data.frame() масив()
Типове використання Числові обчислення та лінійна алгебра Змішані дані спостережень Складені таблиці, такі як кількість за роком
Мітки рядків Додаткові назви розмірів Назви рядків завжди присутні Додаткові назви розмірів
# 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')

Зверніться до матриці, коли кожна клітинка є числом одного типу, а робота є арифметичною. Зверніться до кадр даних коли стовпці містять різні типи, наприклад, символьну назву поруч із числовою ціною та фактор. Потягніться за список коли частини мають різну довжину, а також для масиву, коли дійсно існує третій індекс, такий як час або регіон. Перетворення в будь-якому напрямку є простим за допомогою as.matrix() та as.data.frame(), тому структура може виконувати завдання, а не навпаки.

Поширені запитання

R переробляє значення, а не відкидає їх, тому matrix(1:3, nrow = 2, ncol = 3) повторює послідовність. Попередження з'являється лише тоді, коли довжина не є точним кратним кількості комірок, що робить помилку тихої переробки легкою для пропускання.

Використовуйте негативний індекс: m[-2, ] видаляє другий рядок, а m[, -3] видаляє третій стовпець. Кілька об'єктів можна використовувати одночасно за допомогою m[-c(1, 4), ]. Початковий об'єкт залишається незмінним, доки ви не присвоїте результат назад.

Вибір одного рядка або стовпця за замовчуванням видаляє порожній вимір. Додайте drop = FALSE, як у m[1, , drop = FALSE], щоб зберегти матрицю з одним рядком. Це важливо, коли результат передається до функції, яка очікує два виміри.

which(m == value, arr.ind = TRUE) повертає результат із двох стовпців, що містить рядок і стовпець кожного збігу. Без arr.ind відповіддю буде один лінійний індекс, що відраховується по стовпцях, що рідко коли потрібно.

Використовуйте array(data, dim = c(rows, columns, layers)) або призначте dim(x) безпосередньо вектору. Тоді зріз приймає один індекс на вимір, наприклад, a[2, 3, 1]. Матриця — це просто двовимірний випадок масиву.

Так. У базовому посібнику з R зазначено, що rowSums та colMeans еквівалентні apply() з sum або mean, але набагато швидші, і обидва перевершують явний цикл for, оскільки ітерація відбувається в скомпільованому коді, а не в інтерпретаторі.

Апроксимація моделі — це лінійна алгебра: ознаки утворюють матрицю, коефіцієнти утворюють вектор, а прогнозування — це єдиний добуток %*%. Багато навчання за допомогою машини тому пакети потребують числової матриці, а не кадру даних як вхідних даних.

Так. Копілот GitHub працює в RStudio 2023.09.0 та пізніших версіях і завершує код з коментарів у відкритому файлі. Перевірте його логіку вимірів у RStudio, оскільки неправильний рядок все одно створює коректну матрицю.

Підсумуйте цей пост за допомогою: