Узнайте, как создавать матрицы, и поймете, как выполнять с ними базовые вычисления.
Что такое матрица?
Матрица - это набор элементов одного и того же типа данных (числовых, символьных или логических), упорядоченных в фиксированное количество строк и столбцов. Двумерная матрица работает только со строками и столбцами.
Функция matrix()
в R создает матрицу. Рассмотрим следующий пример:
matrix(1:9, byrow=TRUE, nrow = 3)
Это создает матрицу из 3 строк, содержащих числа от 1 до 9, заполненных построчно.
В функции matrix()
:
- Первый аргумент - это набор элементов, которые R разместит в строках и столбцах матрицы. Здесь мы использовали
1:9
(это то же самое, что иc(1,2,3,4,5,6,7,8,9)
(см. Векторы в R)). Это необязательный аргумент, и его можно будет заполнить позже. Если оставить поле пустым, матрица просто не будет заполнена. - Аргумент
byrow
указывает, что матрица заполняется построчно. Если мы хотим, чтобы матрица заполнялась по столбцам, мы устанавливаем этот аргумент вFALSE
(то естьbyrow=FALSE
). По умолчанию матрица заполняется столбцамиbyrow=FALSE
.
# Row-wise # Column-wise 1 2 3 1 4 7 4 5 6 2 5 8 7 8 9 3 6 9
- Третий аргумент
nrow
указывает желаемое количество строк.nrows=3
указывает, что матрица должна иметь три строки.
Есть и другие аргументы, такие как:
ncol
, который указывает желаемое количество столбцов.
Создание матрицы из векторов
Давайте проанализируем кассовые сборы франшизы «Звездные войны».
Ниже приведены три вектора, каждый из которых определяет кассовые сборы одного из первых трех фильмов Звездных войн. Первый элемент каждого вектора указывает на кассовые сборы в США, второй элемент - на кассовые сборы за пределами США (Источник: Википедия).
# Box office Star Wars (in millions) new_hope <- c(460.998, 314.4) empire_strikes <- c(290.475, 247.900) return_jedi <- c(309.306, 165.8)
Чтобы построить матрицу из этих трех векторов, нам сначала нужно объединить три вектора в один.
box_office <- c(new_hope, empire_strikes, return_jedi)
Затем мы используем функцию matrix()
для построения матрицы. Первый аргумент - это вектор box_office
, содержащий все кассовые сборы. Затем мы должны указать nrow=3
и byrow=TRUE
, чтобы построить матрицу с 3 строками, заполненными построчно (первый столбец будет представлять доход в США, второй - доход за пределами США).
star_wars_matrix <- matrix(box_office, byrow=TRUE, nrow=3)
Именование матрицы
Часто бывает полезно добавить имена к строкам и столбцам матрицы, чтобы помочь запомнить, что в ней хранится. Это помогает не только читать данные, но и выбирать определенные элементы из матрицы. Этого можно добиться с помощью функций colnames()
и rownames()
.
rownames(my_matrix) <- row_names_vector colnames(my_matrix) <- col_names_vector
Чтобы назвать столбцы по регионам и заголовкам, необходимы векторы, представляющие эти имена.
# Vectors region and titles, used for naming region <- c("US", "non-US") titles <- c("A New Hope", "The Empire Strikes Back", "Return of the Jedi")
Чтобы присвоить столбцам star_wars_matrix
имя region
вектор, необходимо использовать colnames()
.
# Name the columns with region colnames(star_wars_matrix) <- region
Чтобы назвать строки star_wars_matrix
вектором titles
, необходимо использовать rownames()
.
# Name the rows with titles rownames(star_wars_matrix) <- titles
Теперь вашему коду должно понравиться что-то вроде этого:
# Box office Star Wars (in millions) new_hope <- c(460.998, 314.4) empire_strikes <- c(290.475, 247.900) return_jedi <- c(309.306, 165.8) # Construct matrix star_wars_matrix <- matrix(c(new_home, empire_strikes, return_jedi), nrow = 3, byrow = TRUE) # Vectors region and titles, used for naming region <- c("US", "non-US") titles <- c("A New Hope", "The Empire Strikes Back", "Return of the Jedi") # Name the columns with region colnames(star_wars_matrix) <- region # Name the rows with titles rownames(star_wars_matrix) <- titles # Print out star_wars_matrix star_wars_matrix
Альтернатива: использование аргумента dimnames
Атрибут dimnames
для матрицы может использоваться для именования строк и столбцов матрицы. Атрибут dimnames
принимает list
длины 2, определяя имена строки и столбца соответственно. Это,
dimnames = list(row_vector,column_vector)
Таким образом, во время построения матрицы мы можем непосредственно пометить ее.
# Construct star_wars_matrix box_office <- c(460.998, 314.4, 290.475, 247.900, 309.306, 165.8) star_wars_matrix <- matrix(box_office, nrow = 3, byrow = TRUE, dimnames = list(c("A New Hope", "The Empire Strikes Back", "Return of the Jedi"),c("US, "non-US")))
Расчет итога по строке
Важной статистикой фильма являются его мировые кассовые сборы. Чтобы рассчитать общую кассовую выручку трех фильмов по «Звездным войнам», вам необходимо определить сумму доходов в США и за пределами США.
Функция rowSums()
вычисляет итоги для каждой строки матрицы и создает новый вектор:
rowSums(my_matrix)
Чтобы вы попробовали
Подсчитайте мировые кассовые сборы трех фильмов.
Решение
# Construct star_wars_matrix box_office <- c(460.998, 314.4, 290.475, 247.900, 309.306, 165.8) star_wars_matrix <- matrix(box_office, nrow = 3, byrow = TRUE, dimnames = list(c("A New Hope", "The Empire Strikes Back", "Return of the Jedi"),c("US, "non-US"))) # Calculate worldwide box office figures worldwide_vector <- rowSums(star_wars_matrix)
Добавление столбца в матрицу
Вы можете добавить столбец или несколько столбцов в матрицу, используя функцию cbind()
, которая объединяет матрицы и / или векторы вместе по столбцу. Например:
big_matrix <- cbind(matrix1, matrix2, vector1, ...)
Чтобы вы попробовали
В предыдущем упражнении вы вычислили вектор, содержащий мировые кассовые сборы для каждого из трех фильмов. Однако этот вектор еще не входит в star_wars_matrix
. Добавьте этот вектор в качестве нового столбца в матрицу и присвойте результат новой матрице.
Решение
# Construct star_wars_matrix box_office <- c(460.998, 314.4, 290.475, 247.900, 309.306, 165.8) star_wars_matrix <- matrix(box_office, nrow = 3, byrow = TRUE, dimnames = list(c("A New Hope", "The Empire Strikes Back", "Return of the Jedi"),c("US, "non-US"))) # Calculate worldwide box office figures worldwide_vector <- rowSums(star_wars_matrix) # Bind the new variable worldwide_vector as a column to star_wars_matrix all_wars_matrix <- cbind(star_wars_matrix, worldwide_vector)
Добавление строки
Чтобы добавить столбец, вы можете использовать cbind()
. Чтобы добавить строку, вы можете использовать rbind()
. Функция rbind()
принимает последовательность аргументов векторов или матриц и объединяет их по строкам. Например,
big_matrix <- rbind(matrix1, matrix2, vector1, ...)
Чтобы вы попробовали
Подобно тому, как вы создали star_wars_matrix
с данными по исходной трилогии, создайте вторую матрицу с аналогичными данными для трилогии приквелов.
Затем используйте rbind()
, чтобы объединить две матрицы, сначала с данными для исходной трилогии, а затем с данными для приквелов.
Решение
# Construct star_wars_matrix box_office <- c(461.0, 314.4, 290.5, 247.9, 309.3, 165.8) star_wars_matrix <- matrix(box_office, nrow = 3, byrow = TRUE, dimnames = list(c("A New Hope", "The Empire Strikes Back", "Return of the Jedi"), c("US", "non-US"))) # Construct star_wars_matrix2 box_office2 <- c(474.5, 552.5, 310.7, 338.7, 380.3, 468.5) star_wars_matrix2 <- matrix(box_office2, nrow = 3, byrow = TRUE, dimnames = list(c("The Phantom Menace", "Attack of the Clones", "Revenge of the Sith"), c("US", "non-US"))) # Combine both Star Wars trilogies in one matrix all_wars_matrix <- rbind(star_wars_matrix, star_wars_matrix2)
Расчет суммы столбца
Подобно тому, как мы использовали rowSums()
для вычисления суммы каждой строки, мы также можем использовать colSums()
для вычисления суммы каждого столбца матрицы.
rowSums(my_matrix)
Чтобы вы попробовали
Используя all_wars_matrix
, построенный в предыдущем упражнении, рассчитайте общую кассовую выручку для США и неамериканского региона для всей саги.
Решение
# Total revenue for US and non-US total_revenue_vector <- colSums(all_wars_matrix)
Выбор элементов матрицы
Подобно векторам, квадратные скобки []
можно использовать для выбора одного или нескольких элементов из матрицы. Поскольку матрицы двумерные, для разделения строк и столбцов необходима запятая. Например:
my_matrix[1,2]
выбирает элемент в первой строке и втором столбце (строка 1, столбец 2)my_matrix[1:3, 2:4]
возвращает матрицу с данными в строках с 1 по 3 и столбцах со 2 по 4.
Чтобы выбрать все элементы строки, номер после столбца не требуется. Чтобы выбрать все элементы столбца, номер перед столбцом не требуется.
my_matrix[,1]
выбирает все элементы первого столбца.my_matrix[1,]
выбирает все элементы первой строки.
Чтобы вы попробовали
Рассчитайте средний доход за пределами США для всех фильмов (совет: выберите весь второй столбец all_wars_matrix
и используйте функцию mean()
).
Решение
# Select the non-US revenue for all movies non_us_all <- all_wars_matrix # Average non-US revenue mean(non_us_all)
Для вас (2)
Вычислите среднее значение для первых двух фильмов саги.
Решение
# Select the non-US revenue for the first two movies non_us_some <- all_wars_matrix[1:2,2] # Average non-US revenue for the first two movies mean(non_us_some)
Матричная арифметика
Стандартные операторы, такие как +
, -
, /
, *
и т. Д., Которые работают с векторами, также работают поэлементно с матрицами.
Например, 2 * my_matrix
умножает каждый элемент my_matrix
на 2.
Вы также можете умножить матрицу на другую матрицу. Например, my_matrix1 * my_matrix2
создает матрицу, в которой каждый элемент является произведением соответствующих элементов в my_matrix1
и my_matrix2
.
Чтобы вы попробовали
Предположим, билет в кино стоил 5 долларов. Определите, сколько посетителей посмотрели каждый фильм для каждой географической области. (Подсказка: просто разделив количество касс на стоимость билета, вы получите количество посетителей).
Решение
# Estimate the visitors visitors <- all_wars_matrix / 5
Для вас (2)
Предположим, цены на билеты со временем вырастут. Учитывая матрицу цен на билеты, определите приблизительное количество посетителей из США и других стран для всех фильмов.
# Construct ticket_prices_matrix ticket_prices <- c(5.0, 5.0, 6.0, 6.0, 7.0, 7.0, 4.0, 4.0, 4.5, 4.5, 4.9, 4.9) ticket_prices_matrix <- matrix(ticket_prices, nrow = 6, byrow = TRUE, dimnames = list(c("A New Hope", "The Empire Strikes Back", "Return of the Jedi","The Phantom Menace", "Attack of the Clones", "Revenge of the Sith"),c("US", "non-US")))
Решение
# Estimated number of visitors visitors <- all_wars_matrix / ticket_prices_matrix
Для вас (3)
Рассчитайте среднее количество посетителей из США (подсказка: вам нужно заполнить второе, чтобы попробовать)
Решение
# US visitors (Select the entire first column) us_visitors <- visitors[,1] # Average number of US visitors mean(us_visitors)
Примечания
Все изображения, если не указано иное, принадлежат автору. Изображение баннера было создано с помощью Canva.