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, ].
Проверьте себя
1. Чем data.frame отличается от обычного вектора?
AНичем
BЭто таблица из колонок, которые могут быть разного типа
CВ нём может быть только один столбец
DВсе колонки обязаны быть одного типа
2. Как обратиться к колонке age таблицы df?
Adf.age
Bdf->age
Cdf$age
Ddf[age]
3. Что вернёт df[df$age > 24, ]?
AКолонку age
BСтроки, где возраст больше 24
CЧисло строк
DОшибку