Функція матриці в R: створення, друк, додавання стовпців і фрагментів
⚡ Розумний підсумок
Матриця в R — це двовимірний масив, який містить один тип даних у m рядках та n стовпцях, побудований за допомогою matrix(), розширений за допомогою cbind() та rbind() та доступний через квадратні дужки.
Матрична функція в R
Матрична функція в R — це двовимірний масив, який має m рядків і n стовпців. Іншими словами, матриця в програмуванні R — це комбінація двох або більше векторів з однаковим типом даних.
Нижче, матриця — це просто вектор, що містить атрибут dim довжини два. Ось чому кожен елемент повинен мати один спільний тип: у момент, коли символьне значення з'єднується з числами, вся матриця перетворюється на символьне. R зберігає значення в одному стовпцевому циклі та використовує dim, щоб визначити, де закінчується кожен рядок, тому вибір тип даних застосовується до всього об'єкта одночасно.
Примітка: Сама matrix() завжди повертає рівно два виміри. Щоб побудувати структуру з трьома або більше вимірами в R, використовуйте array() з вектором dim або призначте dim() безпосередньо. На діаграмі нижче показано розташування рядків і стовпців, якого дотримується кожна матриця.
Як створити матрицю в 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 за допомогою dim()
Тепер давайте надрукуємо розмірність матриці в 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 за допомогою dim()
Знову надрукуйте розмірність матриці за допомогою 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
Такі стандартні мітки, як [,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(), тому структура може виконувати завдання, а не навпаки.





