Узнайте, как создавать матрицы, и поймете, как выполнять с ними базовые вычисления.

Что такое матрица?

Матрица - это набор элементов одного и того же типа данных (числовых, символьных или логических), упорядоченных в фиксированное количество строк и столбцов. Двумерная матрица работает только со строками и столбцами.

Функция 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.