При работе с циклами часто бывает необходимо заранее создать результирующую переменную, в которую будут записываться результаты работы цикла. При этом циклы могут работать со всеми основными типами объектов в R: векторами, матрицами, списками или таблицами данных. При этом каждый объект может содежрать в себе различные классы: целые числа, строки символов, логические векторы и т.д.

В этом посте мы рассмотрим способы создания пустых переменных заданного типа и размерности.

Векторы

integer(n) создаёт объект типа integer (число с фиксированной запятой) длинной n.
numeric(n) создаёт объект типа double (число с плавающей запятой) длинной n.
double(n) создаёт объект типа double (число с плавающей запятой) длинной n (число двойной точности).
single(n) создаёт объект типа double (число с плавающей запятой) длинной n (число одинарной точности).
complex(n) создаёт объект типа complex (комплексный тип данных) длинной n.
character(n) создаёт объект типа character (строковый тип данных) длинной n.
logical(n) создаёт объект типа logical (логический тип данных) длинной n.

Создание любого типа вектора можно также осуществить с помощью функции vector(). Данная функция принимает два аргумента: mode, указывающая тип данных и length, указывающая длину вектора. Например, создание вектора целых чисел, длиной 100 можно создать с помощью следующих команд:

x <- integer(100)
x <- vector(mode = "integer", length = 100)

Ещё один способ создания вектора — это функция rep(). Вот как будет выглядеть создание вектора с помощью этой функции:

x <- rep(NA, 100)

Обратите внимане, что пропущенные значения могут быть разных типов, поэтому, чтобы получить вектор желаемого типа, вам нужно указать тип NA. Примеры:

class(rep(NA, 10))
#> [1] "logical"
class(rep(NA_real_, 10))
#> [1] "numeric"
class(rep(NA_integer_, 10))
#> [1] "integer"
class(rep(NA_character_, 10))
#> [1] "character"

Списки

Списки можно создавать с помощью уже рассмотренной ранее функции vector():

l <- vector(mode = "list", length = 10)

Матрицы

Матрицы создаются с помощью соответствующей функции matrix(). Для создания матрицы необходимого размера, нам нужно указать количество строк и столбцов. Пример создания матрицы:

m <- matrix(NA, nrow = 100, ncol = 10)

Поскольку матрица является также массивом, то матрицу можно также создать с помощью функции array(). Например:

m <- array(NA, dim = c(100, 10))

Переменные, полученные с помощью функций matrix() и array() будут идентичными. Убедиться в этом можно с помощью функции identical():

identical(matrix(NA, nrow = 100, ncol = 10),
          array(NA, dim = c(100, 10)))
#> [1] TRUE

Матрицы и массивы можно также получить путём преобразования векторов или списков. Для этого необходимо изменить атрибут объекта, в котом хранится информация о размерности объекта. Получить информацию о размерности объекта можно с помощью функции dim(). Данная функция также позволяет изменять размерность объекта. Приведём примеры:

m <- array(NA, dim = c(3, 2)) # создаём двухмерный массив с 3 строками и 2 столбцами
m
#>      [,1] [,2]
#> [1,]   NA   NA
#> [2,]   NA   NA
#> [3,]   NA   NA
dim(m)
#> [1] 3 2
dim(m) <- c(2, 3) # изменяем количество строк и столбцов
m
#>      [,1] [,2] [,3]
#> [1,]   NA   NA   NA
#> [2,]   NA   NA   NA
dim(m)
#> [1] 2 3

Теперь мы можем преобразовать вектор в матрицы путём присвоения вектору нужной нам размерности:

m <- rep(NA, 1000)
dim(m) <- c(100, 10)

Обратим внимание на то, что количество элементов в векторе и массиве должно быть одинаковым, в противном случае R выдаст ошибку. Результат данного преобразования будут также идентичен предыдущим примерам:

m1 <- matrix(NA, nrow = 100, ncol = 10)
m2 <- rep(NA, 1000)
dim(m2) <- c(100, 10)
identical(m1, m2)
#> [1] TRUE

Таблицы данных

Таблицы данных (data.frame) могут могу быть созданы путём объединения векторов, содержащих требуемые типы данных:

d <- data.frame(A = integer(100),
                B = character(100),
                C = double(100),
                D = double(100),
                E = integer(100),
                stringsAsFactors = FALSE)