Матрична функция в 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 ще подреди в редовете и колоните на матрицата.
- nrowБрой редове.
- ncolБрой колони.
- 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 и така нататък.
Изведете размерността на матрица_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, така че тя да може да бъде съединена с 4×3 matrix_c, за да се получи резултат 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) решава линейна система.
- rowSums / colSums / rowMeans / colMeansДокументирано като еквивалент на apply() със sum или mean, но много по-бързо.
- приложи(м, МАРЖИН, ЗАБАВЛЕНИЕ): MARGIN = 1 обхожда редовете, а MARGIN = 2 обхожда колоните, за всяка предоставена от вас функция.
- диагностика, детекция, кръстосана продукцияДиагонал, детерминанта и по-бързата форма на t(x) %*% y.
Тъй като тези операции са векторизирани, те заместват цикли, вместо да се намират вътре в тях. Резюме, което би изисквало вложен for цикъл върху хиляди клетки, се превръща в едно единствено извикване на colMeans(), което е от значение веднага щом данните нараснат.
Матрица срещу рамка от данни срещу масив в R
Матриците, кадрите с данни и масивите изглеждат правоъгълни в конзолата, но отговарят на различни въпроси. Таблицата ги поставя една до друга.
| Имот | матрица | Кадр от данни | Array |
|---|---|---|---|
| Размери | Точно 2 | Точно 2 | Всяко число |
| Типове колони | Един тип за целия обект | Различен тип на колона | Един тип за целия обект |
| Изграден с | матрица() | данни.кадър() | масив() |
| Типична употреба | Числови изчисления и линейна алгебра | Смесени данни от наблюдения | Наслагвани таблици, като например брой по година |
| Етикети на редове | Незадължителни имена на димени | Имената на редовете винаги са налични | Незадължителни имена на димени |
# 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(), така че структурата може да следва задачата, а не обратното.




