Функция [ (квадратная скобка) в R служит для отбора отдельных элементов или наборов элементов из векторов, списков (list), матриц и массивов (data.frame). Разберём, как это делать в data.frame.

Возьмём для примера массив “amis” из пакета “boot”.

library(boot)
data(amis)

В массиве содержатся результаты эксперимента по оценке влияния предупредительных дорожных знаков на скорость автомобилей. Массив состоит из четырёх колонок. speed – скорость автомобиля, period – время замера скорости: до установки знака / сразу после установки / через время после установки, warning – тип участка, на котором проводился замер: тестовый или контрольный, pair – порядковый номер пары участков, на которой проведён замер. В массиве 8437 строк, т.е. замеров скоростей.

head(amis)
##   speed period warning pair
## 1    26      1       1    1
## 2    26      1       1    1
## 3    26      1       1    1
## 4    26      1       1    1
## 5    27      1       1    1
## 6    28      1       1    1

Отбор по условию

Отберём те строки, которые относятся к контрольной группе (warning==2).

x <- amis[amis$warning == 2, ]
head(x)
##     speed period warning pair
## 201    21      1       2    1
## 202    25      1       2    1
## 203    25      1       2    1
## 204    26      1       2    1
## 205    26      1       2    1
## 206    26      1       2    1

В данном случае мы применили функцию квадратной скобки к массиву amis. Выражение, указанное между открывающей квадратной скобкой и запятой, задаёт требования для отбора строк: такие строки, в которых переменная warning равна двум. Между запятой и закрывающей квадратной скобкой указывается, какие колонки мы хотим отобрать. Пустота в нашем случае - это указание на отбор всех колонок.

Добавим к предыдущему примеру отбор только колонки со скоростью.

x <- amis[amis$warning == 2, "speed"]
head(x)
## [1] 21 25 25 26 26 26

Наш двухмерный массив превратился в одномерный вектор. В фукнцию “[” заложена такая логика, что если после отбора измерение становится лишним, то оно удаляется. Иногда это полезно, иногда нет. Чтобы оставить два измерения, необходимо добавить аргумент drop=FALSE.

x <- amis[amis$warning == 2, "speed", drop = FALSE]
head(x)
##     speed
## 201    21
## 202    25
## 203    25
## 204    26
## 205    26
## 206    26

Отбор по номерам строк и колонок

Снова отберём колонку со скоростью, но указываем колонку не по имени, а по её порядковому номеру (она в массиве первая).

x <- amis[amis$warning == 2, 1, drop = FALSE]
head(x)
##     speed
## 201    21
## 202    25
## 203    25
## 204    26
## 205    26
## 206    26

Номера можно указывать и при отборе строк. Отберём строки 7, 9, 16 и 18 из колонок №1, 2.

x <- amis[c(7, 9, 16, 18), 1:2]
head(x)
##    speed period
## 7     28      1
## 9     28      1
## 16    29      1
## 18    30      1

Объединение условий для отбора

Критерии для отбора можно комбинировать через операторы. Отберём строки из тестовой группы (warnning=1) и из временного периода до установки знака (period=1). Объединение происходит через логический оператор & (логическое И).

x <- amis[amis$warning == 1 & amis$period == 1, ]
head(x)
##   speed period warning pair
## 1    26      1       1    1
## 2    26      1       1    1
## 3    26      1       1    1
## 4    26      1       1    1
## 5    27      1       1    1
## 6    28      1       1    1

Отберём наблюдения из контрольной группы (warning=2), относящиеся к временным периодам сразу после установки знака (period=2) и через время после установки знака (period-3). Возможно несколько вариантов.

x <- amis[amis$warning == 2 & (amis$period == 2 | amis$period == 3), ]
x1 <- amis[amis$warning == 2 & amis$period > 1, ]
x2 <- amis[amis$warning == 2 & amis$period %in% 2:3, ]

В x мы использовали оператор “логическое ИЛИ” и скобки, чтобы установить нужный нам порядок вычисления условий.

В x2 мы использовали функцию %in%, которая проверяет, равен ли первый аргумент (amis$period) какому-либо из значений второго арумента (2 или 3).