Журнал LinuxFormat - перейти на главную

LXF103:R

Материал из Linuxformat
Версия от 12:07, 10 апреля 2009; Crazy Rebel (обсуждение | вклад)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск
R Свободный инструментарий для статистической обработки данных

Типы данных в R и работа с ними

ЧАСТЬ 3 Теперь, когда мы уже знаем достаточно для того, чтобы суметь загрузить данные в R, рассмотрим, что же происходит с ними внутри системы, и как, собственно, они обрабатываются.

В статистике, данные принято делить на различные типы, в зависимости от того, насколько близко их можно представить при помощи известной метафоры числовой прямой. Например, возраст человека легко выразить подобным образом, за тем исключением, что он не может быть отрицательным. Размер ботинок представить уже сложнее, поскольку между двумя соседним размерами, как правило, не бывает промежуточного значения, в то время как между двумя любыми числами на числовой прямой всегда можно найти нечто промежуточное. Зато размеры можно хотя бы расположить по возрастающей или по убывающей. А вот c полом человека так уже не получится: есть только два значения, и «промежуточного» просто не бывает. Мы, конечно, можем обозначить женский пол единицей, а мужской – нулем (или двойкой), но никакой числовой информации эти обозначения нести не будут – их даже нельзя отсортировать. Есть ещё и другие специальные виды данных, например, углы, географические координаты, даты и т.п., но все они так или иначе могут быть представлены с помощью чисел. Таким образом, наиболее принципиальное различие между типами данных – возможность или невозможность отобразить их на числа. Если этого сделать нельзя, такие данные принято называть категориальными. Статистические законы, а значит, и статистические программы, работают с этими данными, только если заранее указан их тип. Остальные типы данных в разных книгах называют по разному: числовые, счётные, порядковые или некатегориальные. Мы же примем название «числовые», как самое простое.

Числовые векторы

Допустим, у нас есть данные о росте семи сотрудников небольшой компании. Вот так можно создать из этих данных простейший вектор:

> x <- c(174, 162, 188, 192, 165, 168, 172)

x – это имя объекта R, <- – функция присвоения, c() – функция создания вектора (от англ. «concatenate», собрать). Собственно, R и работает, в основном, с объектами и функциями. У объекта может быть своя структура:

 > str(x)
  num [1:7] 174 162 188 192 165 168 172

то есть x – это числовой (num, numerical) вектор. В других языках программирования бывают ещё скаляры, но в R, как мы знаем (LXF100/101), их нет. «Одиночные» объекты трактуются как векторы из одного элемента.

Вот так можно проверить, вектор ли перед нами:

 > is.vector(x)
 [1] TRUE

Вообще говоря, в R есть множество функций вида is.что-то() для подобной проверки, а ещё есть функции вида as.что-то() – мы будем использовать их далее по тексту. Называть объекты можно, в принципе, как угодно, но лучше придерживаться некоторых простых правил:

  • Использовать для названий только латинские буквы, цифры и точку (имена объектов не должны начинаться с точки или цифры);
  • Помнить, что R чувствителен к регистру: X и x – это разные имена;
  • Не давать объектам имена, уже занятые распространенными функциями (типа c()), а также ключевыми словами (особенно T, F, NA, NaN, Inf).

Для создания «искусственных» векторов очень полезен оператор :, а также функции seq() и rep().

Факторы

Для обозначения категориальных данных в R есть несколько способов, разной степени «правильности». Во-первых, можно создать текстовый (character) вектор:

 > sex <- c( “male”, “female”, “male”, “male”,
 +                      “female”, “male”, “male”)
 > is.character(sex)
 [1] TRUE
 > is.vector(sex)
 [1] TRUE
 > str(sex)
 chr [1:7] “male” “female” “male” “male” “female” “male” ...

Предположим, что sex – это описание пола сотрудников небольшой организации. Вот как R выводит содержимое этого вектора (Да-да, квадратные скобки – это тоже команда. Можно это проверить, набрав помощь ?”[“):

 > sex
 [1] “male” “female” “male” “male” “female” “male” “male”

Наверное, пора раскрыть загадку единицы в квадратных скобках – это просто номер элемента вектора. Вот как его можно использовать :

 > sex[1]
 [1] “male”

«Умные», то есть объект-ориентированные команды R кое-что «понимают» про объект sex, например, команда table() выводит:

 > table(sex)
 sex
 female male
    2      5


А вот команда plot(), увы, не может сделать с таким вектором ничего вразумительного. И это, в общем-то, правильно, потому что программа ничего не знает про свойства пола человека. В таких случаях пользователь сам должен проинформировать R, что его надо рассматривать как категориальный тип данных. Делается это так:

> sex.f <- factor(sex)
> sex.f
[1] male female male male female male male
Levels: female male

И теперь команда plot() уже понимает, что ей надо делать:

 > plot(sex.f)

потому что «видит» специальный тип объекта, предназначенный для категориальных данных – фактор с двумя уровнями (levels):

 > is.factor(sex.f)
 [1] TRUE
 > is.character(sex.f)
 [1] FALSE
 > str(sex.f)
 Factor w/ 2 levels “female”,“male”: 2 1 2 2 1 2 2

Очень многие функции R (тот же самый plot()) предпочитают факторы текстовым векторам. При этом некоторые умеют конвертировать текстовые векторы в факторы, а некоторые – нет, поэтому надо быть внимательным.

Есть ещё несколько важных свойств факторов, которые надо знать заранее. Во-первых, подмножество фактора – это фактор с тем же количеством уровней, даже если их в подмножестве не осталось:

 > sex.f[5:6]
 [1] female male
 Levels: female male
 > sex.f[6:7]
 [1] male male
 Levels: female male

«Избавиться» от лишнего уровня можно, только применив специальный аргумент или выполнив преобразование данных «туда и обратно»:

> sex.f[6:7, drop=TRUE]
[1] male male
Levels: male
> factor(as.character(sex.f[6:7]))
[1] male male
Levels: male

Во-вторых, факторы в отличие от текстовых векторов можно легко преобразовать в числовые значения:

> as.numeric(sex.f)
[1] 2 1 2 2 1 2 2


Зачем это нужно, становится понятным, если рассмотреть вот такой пример: положим, кроме роста, у нас есть ещё и данные по весу сотрудников и мы хотим построить такой график, на котором были бы видны одновременно рост, вес и пол. Вот как это можно сделать:

> # Вектор веса
> w <- c(69, 68, 93, 87, 59, 82, 72)
> # Построение графика
> plot(x, w, pch=as.numeric(sex.f), col=as.numeric(sex.f))
> legend( “topleft”, pch=1:2, col=1:2, legend=levels(sex.f))

Тут, разумеется, нужно кое-что объяснить. pch и col – это параметры, предназначенные, соответственно, для определения типа значков и их цвета на графике. Таким образом, в зависимости от того, какому полу принадлежит данная точка, она будет изображена кружком или треугольником и чёрным или красным цветом. При условии, разумеется, что все три вектора соответствуют друг другу. Ещё надо отметить,

Персональные инструменты
купить
подписаться
Яндекс.Метрика