Матрична функция в 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 Създаване на печат добавяне на колона и срез

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

Матрична функция в R е двумерен масив, който има m брой редове и n брой колони. С други думи, матрицата в R програмирането е комбинация от два или повече вектора със същия тип данни.

По-долу, матрицата е просто вектор, носещ атрибут dim с дължина две. Ето защо всеки елемент трябва да споделя един тип: в момента, в който символна стойност се свързва с числа, цялата матрица се привежда към символна. R съхранява стойностите в един ред по колони и използва dim, за да реши къде завършва всеки ред, така че изборът на тип данни прилага се едновременно за целия обект.

Забележка: Самата matrix() винаги връща точно две измерения. За да изградите структура с три или повече измерения в R, използвайте array() с вектор dim или присвоете директно dim(). Диаграмата по-долу показва оформлението на редовете и колоните, което всяка матрица следва.

Разположение на редове и колони на матрична функция в R

Как да създадете матрица в 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 и така нататък.

Конзолен изход на 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, така че тя да може да бъде съединена с 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

Наименувайте редовете и колоните на матрица в 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(), така че структурата може да следва задачата, а не обратното.

Въпроси и Отговори

R рециклира стойностите, вместо да ги отхвърля, така че matrix(1:3, nrow = 2, ncol = 3) повтаря последователността. Предупреждение се появява само когато дължината не е точно кратно на броя на клетките, което прави тихото рециклиране лесен за пропускане бъг.

Използвайте отрицателен индекс: m[-2, ] премахва втория ред, а m[, -3] премахва третата колона. Няколко могат да бъдат използвани едновременно с m[-c(1, 4), ]. Оригиналният обект остава непроменен, докато не присвоите резултата обратно.

Избирането на един ред или колона премахва празното измерение по подразбиране. Добавете drop = FALSE, както в m[1, , drop = FALSE], за да запазите матрица с един ред. Това е важно, когато резултатът се предава на функция, която очаква две измерения.

which(m == стойност, 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, защото грешен ред все още води до валидна матрица.

Обобщете тази публикация с: