В R матрицу можно легко создать при помощи одноименной функции matrix(). В состав основных аргументов этой функции входят преобразуемый в матрицу вектор, а также параметры, определяющие количество строк (nrow – от number of rows) и столбцов (ncol – от number of columns). Так, для создания матрицы my.mat из четырех строк и четырех столбцов, содержащей совокупность чисел от 1 до 16, необходимо выполнить следующую команду:
Обратите внимание на то, что по умолчанию заполнение матрицы происходит по столбцам, т.е. первые четыре значения входят в первый столбец, следующие четыре значения – во второй столбец, и т.д. Такой порядок заполнения можно изменить, придав специальному аргументу byrow (от by row – по строкам) значение TRUE:
my.mat <- matrix(seq(1, 16), nrow = 4, ncol = 4, byrow = TRUE)
my.mat [,1] [,2] [,3] [,4] [1,] 1 2 3 4 [2,] 5 6 7 8 [3,] 9 10 11 12 [4,] 13 14 15 16
В качестве заголовков строк и столбцов создаваемой матрицы автоматически выводятся соответствующие индексные номера (строки: [1,], [2,], и т.д.; столбцы: [,1], [,2], и т.д.). Для придания пользовательских заголовков строкам и столбцам матриц используют функции rownames() и colnames() соответственно. Например, для обозначения строк матрицы my.mat буквами A, B, C и D необходимо выполнить следующее:
В матрице my.mat имеется 16 значений, которые как раз вмещаются в имеющиеся четыре строки и четыре столбца. Но что произойдет, если, например, попытаться вместить вектор из 12 чисел в матрицу того же размера? В подобных случаях R заполняет недостающие значения за счет «зацикливания» (recycling) короткого вектора. Вот как это выглядит на примере:
my.mat2 <- matrix(seq(1, 12), nrow = 4, ncol = 4, byrow = TRUE)
my.mat2 [,1] [,2] [,3] [,4] [1,] 1 2 3 4 [2,] 5 6 7 8 [3,] 9 10 11 12 [4,] 1 2 3 4
Как видим, для заполнения ячеек последней строки матрицы my.mat2 программа снова использовала числа 1, 2, 3, и 4.
Альтернативный способ создания матриц заключается в применении функции dim() (от dimension – размерность). Так, матрицу my.mat мы могли бы сформировать следующим образом:
my.mat <- 1:16 # Задаем размерность 4x4 вектору my.mat: dim(my.mat) <- c(4, 4) my.mat [,1] [,2] [,3] [,4] [1,] 1 5 9 13 [2,] 2 6 10 14 [3,] 3 7 11 15 [4,] 4 8 12 16 # Функция dim() очень полезна. Она позволяет проверить размерность # уже имеющейся матрицы (или таблицы данных), например: dim(my.mat) [1] 4 4
Матрицу можно собрать также из нескольких векторов, используя функции cbind() (от сolum и bind – столбец и связывать) или rbind() (от row и bind – строка и связывать):
# Cоздадим четыре вектора одинаковой длины: a <- c(1, 2, 3, 4) b <- c(5, 6, 7, 8) d <- c(9, 10, 11, 12) e <- c(13, 14, 15, 16) # Объединим этим векторы при помощи функции cbind(): cbind(a, b, d, e) a b d e [1,] 1 5 9 13 [2,] 2 6 10 14 [3,] 3 7 11 15 [4,] 4 8 12 16 # Объединим те же векторы при помощи функции rbind(): rbind(a, b, d, e) [,1] [,2] [,3] [,4] a 1 2 3 4 b 5 6 7 8 d 9 10 11 12 e 13 14 15 16
Вспомним, что матрицы и массивы – это те же векторы, но с размерностью 2 или выше. Поэтому практически все векторные операции (см. здесь) одинаково применимы в отношении матриц и массивов. Так, путем индексирования мы можем извлекать из матриц необходимые элементы и далее подвергать их требуемым преобразованиям. Рассмотрим лишь несколько примеров:
# Извлечем элемент матрицы my.mat, расположенный на # пересечении 2-й строки и 3-го столбца: my.mat[2, 3] [1] 7 # Извлечем из матрицы все элементы, находящиеся в 4-м столбце # (для этого номера строк перед запятой можно просто не указывать): my.mat[, 4] [1] 4 8 12 16 # Извлечем из матрицы все элементы, находящиеся в 1-й строке # (в этом случае нет необходимости указывать номера столбцов): my.mat[1, ] [1] 1 2 3 4 # Перемножим 1-й и 4-й столбцы матрицы (поэлементно): my.mat[, 1]*my.mat[, 4] [1] 4 40 108 208
Отметим, наконец, что при необходимости матрицу можно транспонировать (т.е. поменять строки и столбцы местами) при помощи функции t() (от transpose):
--
Создано при помощи Pretty R на сайте inside-R.org
Отправить комментарий