Функция [ (квадратная скобка) в 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).
Благодарю! Очень помогла Ваша информация!