data.frame — таблица данных
Главная структура для реальных данных — data.frame, таблица из колонок-векторов.
data.frame — прямоугольная таблица: набор колонок-векторов одинаковой длины, возможно разного типа.
Векторы хороши для одной переменной, но данные обычно табличные: строки — наблюдения (люди, товары, дни), столбцы — признаки (имя, возраст, цена). Для этого в R есть data.frame — аналог таблицы Excel или листа базы данных.
Табличная форма — это «прямоугольные» данные, и почти весь практический анализ крутится именно вокруг неё. Ключевая договорённость, принятая в аналитике: одна строка — одно наблюдение, один столбец — один признак, одна ячейка — одно значение. Такие «аккуратные» (tidy) данные удобно фильтровать, группировать, рисовать и моделировать. data.frame — структура, которая хранит данные именно в этом виде, и потому она центральная во всём курсе: CSV мы читаем в data.frame, dplyr преобразует data.frame, ggplot2 рисует из data.frame, регрессия учится на data.frame.
Создание таблицы
Таблицу собирают из именованных колонок:
df <- data.frame(
name = c("Аня", "Борис", "Вера"),
age = c(25, 30, 22),
city = c("Москва", "Казань", "Москва")
)
dfВывод:
name age city 1 Аня 25 Москва 2 Борис 30 Казань 3 Вера 22 Москва
Каждая колонка — вектор своего типа: name и city текстовые, age числовой. Слева R пронумеровал строки.
Доступ к колонкам
К отдельному столбцу обращаются через знак доллара $:
df$age
mean(df$age)Вывод:
[1] 25 30 22 [1] 25.66667
Колонка — это обычный вектор, поэтому к ней применимы все знакомые функции: mean, sum, индексация.
Доступ к строкам и ячейкам
Двумерная индексация работает как df[строки, столбцы]:
df[1, ]
df[, "city"]
df[df$age > 24, ]Вывод:
name age city 1 Аня 25 Москва [1] "Москва" "Казань" "Москва" name age city 1 Аня 25 Москва 2 Борис 30 Казань
Пустое место означает «все». df[1, ] — вся первая строка, df[, "city"] — весь столбец города, а df[df$age > 24, ] — строки, где возраст больше 24. Последнее — фильтрация таблицы по условию.
Как работает под капотом
Внутри data.frame — это список (list) векторов одинаковой длины, где каждый элемент списка является колонкой. Поэтому все колонки обязаны быть равной длины, но могут иметь разный тип — в отличие от вектора, где тип один на всех. Из-за этого df$age — настоящий вектор, и операции над ним мгновенны.
Частые ошибки
- Колонки разной длины.
data.frameтребует равной длины всех векторов, иначе ошибка. - Забыть запятую в двумерной индексации.
df[1]— это первый столбец, аdf[1, ]— первая строка. Запятая важна. - Опечатка в имени колонки.
df$Ageпри колонкеageвернётNULL, а не ошибку — легко не заметить.
Итог
data.frame— таблица из колонок-векторов одинаковой длины.- К колонке обращаются через
$. - Двумерная индексация:
df[строки, столбцы]. - Фильтр строк по условию:
df[df$age > 24, ].