10 июля 2011

Объекты и типы данных R: матрицы



Матрица (matrix) представляет собой двумерную совокупность числовых, логических или текстовых величин. В свою очередь массив (array) – это совокупность некоторых однотипных элементов, обладающая размерностью больше двух. 

В R матрицу можно легко создать при помощи одноименной функции matrix(). В состав основных аргументов этой функции входят преобразуемый в матрицу вектор, а также параметры, определяющие количество строк (nrow – от number of rows) и столбцов (ncol – от number of columns). Так, для создания матрицы my.mat из четырех строк и четырех столбцов, содержащей совокупность чисел от 1 до 16, необходимо выполнить следующую команду:

my.mat <- matrix(seq(1, 16), nrow = 4, ncol = 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

Обратите внимание на то, что по умолчанию заполнение матрицы происходит по столбцам, т.е. первые четыре значения входят в первый столбец, следующие четыре значения – во второй столбец, и т.д. Такой порядок заполнения можно изменить, придав специальному аргументу 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 необходимо выполнить следующее:

rownames(my.mat) <- c("A", "B", "C", "D")
my.mat
  [,1] [,2] [,3] [,4]
A    1    2    3    4
B    5    6    7    8
C    9   10   11   12
D   13   14   15   16

В матрице 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):

t(my.mat)
     A B  C  D
[1,] 1 5  9 13
[2,] 2 6 10 14
[3,] 3 7 11 15
[4,] 4 8 12 16

--
Создано при помощи Pretty R на сайте inside-R.org

Комментариев нет :

Отправить комментарий