23 июля 2011

Объекты и типы данных R: таблицы данных



Таблица данных (data frame) представляет собой объект R, по структуре напоминающий лист электронной таблицы Microsoft Excel. Каждый столбец таблицы является вектором, содержащим данные определенного типа. При этом действует правило, согласно которому все столбцы должны иметь одинаковую длину (собственно, с "точки зрения" R таблица данных является частным случаем списка, в котором все компоненты-векторы имеют одинаковый размер). Часто на практике некоторые значения в таблице отсутствуют, что может быть обусловлено множеством причин: на момент измерения прибор вышел из строя, по невнимательности персонала измерение не было занесено в протокол исследования, испытуемый отказался отвечать на определенный вопрос(ы) в анкете, была утеряна проба, и т.п. Ячейки с такими отсутствующими значениями (missing values) в таблицах данных R не могут быть просто пустыми – иначе столбцы таблицы окажутся разной длины. Для обозначения отсутствующих наблюдений в языке R имеется специальное значение – NA (not available – не доступно).


Таблицы данных – это основной класс объектов R, используемых для хранения данных. Обычно такие таблицы подготавливаются при помощи сторонних приложений (особенно популярна и удобна программа Microsoft Excel) и затем загружаются в среду R. Подробнее об импортировании данных в R рассказано здесь. Тем не менее, небольшую таблицу можно собрать из нескольких векторов средствами самой системы R. Для этого используют функцию data.frame().

Предположим, у нас есть наблюдения по общей численности мужского (Male) и женского (Female) населения в трех городах City1, City2, и City3. Представим эти данные в виде одной таблицы с именем CITY. Для начала создадим текстовые векторы с названиями городов (сity) и пола (sex), а также вектор со значениями численности представителей каждого пола (number):

city <- c("City1", "City1", "City2", "City2", "City3", "City3")
sex <- c("Male", "Female", "Male", "Female", "Male", "Female")
number <- c(12450, 10345, 5670, 5800, 25129, 26000)

Теперь объединим эти три вектора в одну таблицу данных и посмотрим, что получилось:

CITY <- data.frame(City = city, Sex = sex, Number = number) 
CITY
   City    Sex Number
1 City1   Male  12450
2 City1 Female  10345
3 City2   Male   5670
4 City2 Female   5800
5 City3   Male  25129
6 City3 Female  26000

Обратите внимание на синтаксис функции data.frame(): ее аргументы перечисляются в формате "заголовок столбца = добавляемый вектор". В качестве заголовков столбцов могут выступать любые пользовательские имена, удовлетворяющие требованиям R (см. об этом подробнее в следующем сообщении).

Как и в случае со списками, извлечь отдельные компоненты таблиц для выполнения необходимых вычислений можно с использованием знака $, двойных квадратных скобок [[]], либо непосредственно по имени столбца:

CITY$Sex
[1] Male Female Male Female Male Female
Levels: Female Male
 
CITY$Number
[1] 12450 10345  5670  5800 25129 26000
 
# Идентичные результаты можно получить при помощи следующих команд:
 
CITY[[2]]
[1] Male Female Male Female Male Female
Levels: Female Male
 
CITY[[3]]
[1] 12450 10345  5670  5800 25129 26000
 
CITY["Sex"]
[1] Male Female Male Female Male Female
Levels: Female Male
 
CITY["Number"]
[1] 12450 10345  5670  5800 25129 26000

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

# Извлекаем 4-й элемент из столбца Number:
 
CITY$Number[4] 
[1] 5800
 
# Извлекаем элементы 1-3 из столбца Number:
 
CITY$Number[1:3] 
[1] 12450 10345  5670
 
# Извлекаем все значения численности населения, превышающие 10000
 
CITY$Number[CITY$Number > 10000] 
[1] 12450 10345 25129 26000
 
# Извлекаем все значения численности мужского населения:
 
CITY$Number[CITY$Sex == "Male"] 
[1] 12450  5670 25129
 
# Повторяем те же команды, но с использованием [[]]:
 
CITY[[3]][4]
[1] 5800
 
CITY[[3]][1:3]
[1] 12450 10345  5670
 
CITY[[3]][CITY$Number >10000]
[1] 12450 10345 25129 26000
 
CITY[[3]][CITY$Sex == "Male"] 
[1] 12450  5670 25129

При работе с большими таблицами данных бывает сложно визуально исследовать всё их содержимое перед началом анализа. Однако визуального просмотра содержимого таблиц и не требуется - полную сводную информацию о них (равно как и о других объектах R) можно лекго получить при помощи команды str() (structure - структура):

str(CITY)
'data.frame':   6 obs. of  3 variables:
 $ City  : Factor w/ 3 levels "City1","City2",..: 1 1 2 2 3 3
 $ Sex   : Factor w/ 2 levels "Female","Male": 2 1 2 1 2 1
 $ Number: num  12450 10345 5670 5800 25129 ...

Как следует из представленного отчета, объект CITY является таблицей данных, в состав которой входят три перменные с шестью наблюдениями каждая. Две из этих перменных - City и Sex - программа автоматически распознала как факторы с тремя и двумя уровнями соответственно. Переменная Number является количественной. Для удобства выводятся также несколько первых значений каждой переменной.

Часто возникает необходимость выяснить лишь имена переменных, входящих в таблицу данных. Это можно сделать при помощи команды names():

names(CITY)
[1] "City"   "Sex"    "Number"

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

head(CITY, n = 3)
   City    Sex Number
1 City1   Male  12450
2 City1 Female  10345
3 City2   Male   5670

tail(CITY, n = 2)
   City    Sex Number
5 City3   Male  25129
6 City3 Female  26000

При необходимости внесения исправлений в таблицу можно воспользоваться встроенным в R редактором данных. Внешне этот редактор напоминает обычный лист Excel, однако имеет весьма ограниченные функциональные возможности. Все, что он позволяет делать – это добавлять новые или исправлять уже введенные значения переменных, изменять заголовки столбцов, а также добавлять новые строки и столбцы. Работая в стандартной версии R, редактор данных можно запустить из меню File -> Data editor либо выполнив команду fix() (fix – исправлять, чинить) из командной строки консоли R (например, fix(CITY)). После внесения исправлений редактор просто закрывают – все изменения будут сохранены автоматически:



Обратите внимание, что в программе RStudio функция fix() в настоящее время не поддерживается.

--
Создано при помощи Pretty R на сайте inside-R.org


4 комментария :

Анонимный комментирует...

Изучаю R, ваши статьи как нельзя кстати.

Как правильнее выполнить вставку в data frame с точки зрения производительности?
То есть реализовать основные аналоги SQL команд по аналогии

Удаление (Delete): CITY <- CITY[CITY$City != "City3"] Удалить данные о City3
Выборка (Select): CITY1 <- CITY[CITY$City == "City1"] Показать данные о City1
Изменение (Update): CITY[CITY$City=="City1",3]<-"City5" Изменить в данных City1 на City5

Не приведете быстрой пример вставки(Insert) данных, например ("City4", "Female", 30000) к уже существующему data.frame?
Извините, что анонимно (google account не сработал).

Sergey Mastitsky комментирует...

"Быстро" добавить вектор ("City4", "Female", 30000) к уже существующей таблице не получится, т.к. в R вектор может быть только одного типа - сочетать символьные выражения с числовыми значениями, как в этом примере, не допускается.
Посему новые данные придется сначала преобразовать в самостоятельную таблицу данных, а потом добавить ее к уже существующей при помощи rbind(). Например:

new <- data.frame(City = "City4", Sex = "Female", Number = 30000)
result <- rbind(old, new)

Можно было бы эти две строки свести и в одну (правда, читаемость кода снизилась бы):
result <- rbind(old, data.frame(City = "City4", Sex = "Female", Number = 30000))

P.S.: настоятельно рекомендую обратить внимание на новый пакет для работы с таблицами - dplyr:
http://r-analytics.blogspot.co.uk/2014/07/tidyr.html
https://www.dropbox.com/sh/i8qnluwmuieicxc/AACsepZJvULCKkbIxK9KP-6Ea/dplyr-tutorial.pdf?dl=0

Анонимный комментирует...

Подскажите пожалуйста, как можно удалить строку из таблицы?

Анонимный комментирует...

как сделать сводный отчет по первому столбцу "сложив" остальные столбики?

Отправить комментарий