30 июня 2011

Объекты и типы данных R: векторы



Язык R принадлежит к семейству так называемых высокоуровневых объектно-ориентированных языков программирования. Для неспециалиста строгое определение понятия «объект» является достаточно абстрактным. Однако для простоты можно называть объектами все, что мы создаем в ходе работы с R. Их выделяют два основных типа: 
  1. Объекты, предназначенные для хранения данныхdata objects») – это векторы, матрицы и массивы, списки, факторы, таблицы данных; 
  2. Функцииfunction objects») – это поименованные программы, предназначенные для выполнения определенных действий над другими объектами.
В этом сообщении будут расмотрены векторы, способы их создания в R, а также основные операции над ними.

Вектор представляет собой поименованный одномерный объект, содержащий набор однотипных элементов (числовые, логические, либо текстовые значения - никакие сочетания  не допускаются). Для создания векторов небольшой длины в R используется т.н. функция конкатенации c() (от "concatenate" – объединять, связывать). В качестве аргументов этой функции через запятую перечисляют объединяемые в вектор значения, например:

my.vector <- c(1, 2, 3, 4, 5)
my.vector
[1] 1 2 3 4 5

Вектор можно создать также при помощи функции scan(), которая "считывает" последовательно вводимые с клавиатуры значения:

X <- scan()
1: 2.9 # после каждого нового значения нажать клавишу "Ввод"
2: 3.1
3: 3.4
4: 3.4
5: 3.7
6: 3.7
7: 2.8
8: 2.5 
9: # выполнение команды scan завершают введением пустой строки
Read 8 items  # программа сообщает о считывании 8 значений
X
[1] 2.9 3.1 3.4 3.4 3.7 3.7 2.8 2.5

Один из недостатков создания векторов при помощи функции scan() состоит в том, что если при вводе значений с клавиатуры допущена ошибка, то придется либо начать ввод заново, либо воспользоваться специальными инструментами корректировки (например, функцией fix();  здесь эти способы не рассматриваются).

Для создания векторов, содержащих совокупность последовательных чисел, удобна функция seq() (от "sequence" – последовательность). Так, вектор с именем S, содержащий совокупность целых чисел от 1 до 7, можно создать следующим образом:

S <- seq(1,7)
S
[1] 1 2 3 4 5 6 7

Идентичный результат будет получен при помощи команды

S <- 1:7
S
[1] 1 2 3 4 5 6 7

В качестве дополнительного аргумента функции seq() можно задать шаг приращения чисел:

S <- seq(from = 1, to = 5, by = 0.5)
S
[1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0

Векторы, содержащие одинаковые значения, создают при помощи функции rep() (от "repeat" – повторять). Например, для формирования текстового вектора Text, содержащего пять значений "test", следует выполнить команду

Text <- rep("test", 5)
Text
[1] "test" "test" "test" "test" "test"

Система R способна выполнять самые разнообразные операции над векторами. Так, несколько векторов можно объединить в один, используя уже рассмотренную выше функцию конкатенации

v1 <- c(1, 2, 3)
v2 <- c(4, 5, 6)
V <- c(v1, v2)
V
[1] 1 2 3 4 5 6

Если попытаться объединить, например, текстовый вектор с числовым, сообщение об ошибке не появится – программа просто преобразует все значения в текстовые:

# создаем текстовый вектор text.vect:
text.vect <- c("a", "b", "c")
# объединяем числовой вектор v1 (см. выше) с текстовым вектором text.vect:
# new.vect <- c(v1, text.vect)
# просмотр содержимого нового вектора new.vect:
new.vect
[1] "1" "2" "3" "a" "b" "c"
# все значения нового вектора взяты в кавычки,
# что указывает на их текстовую природу;
# для подтверждения этого воспользуемся командой mode():
mode(new.vect)
[1] "character" # все верно: "character" значит "текстовый"

Для работы c определенным элементом вектора необходимо уметь отличать его от других похожих элементов. Для этого при создании вектора всем его компонентам автоматически присваиваются индексные номера, начиная с 1. Чтобы обратится к конкретному элементу необходимо указать имя вектора и индекс этого элемента в квадратных скобках:

# создадим числовой вектор y, содержащий 5 числовых значений:
y <- c(5, 3, 2, 6, 1)
# проверим, чему равен третий элемент вектора y:
y[3]
[1] 2

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

# создадим еще один числовой вектор z, содержащий 3 значения:
z <- c(0.5, 0.1, 0.6)
# умножим первый элемент вектора y на третий элемент вектора z (т.е. 5*0.6):
y[1]*z[3]
[1] 3 

Индексирование является мощным инструментом, позволяющим создавать совокупности значений в соответствии с определенными критериями. Например, для вывода на экран 3-го, 4-го и 5-го значений вектора y необходимо выполнить команду

y[3:5]
[1] 2 6 1

Из этого же вектора мы можем выбрать, например, только первое и четвертое значения, используя уже известную нам функцию конкатенации с()

y[с(1, 4)]
[1] 5 6

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


y[-с(1, 4)]
[1] 3 2 1


В качестве критерия для выбора значений может служить логическое выражение. Для примера выберем из вектора y все значения >2:

y[y>2]
[1] 5 3 6

Ниже перечислены все используемые в R логические операторы:
  • "Равно"   ==
  • "Не равно"   !=
  • "Меньше"  <
  • "Больше"   >
  • "Меньше либо равно"   <=
  • "Больше либо равно"   >=
  • "Логическое И"   &
  • "Логическое ИЛИ"   |
  • "Логическое НЕ"   !
Индексирование является также удобным инструментом для внесения исправлений в имеющихся векторах. Например, так можно исправить второе значение созданного нами ранее вектора z с 0.1 на 0.3:

z[2] <- 0.3
z
[1] 0.5 0.3 0.6

Для упорядочения значений вектора по возрастанию или убыванию используют функцию sort() в сочетании с аргументом decreasing = FALSE или decreasing = TRUE соответственно ("decreasing" значит «убывающий»):

sort(z, decreasing = FALSE)
[1] 0.3 0.5 0.6
sort(z, decreasing = TRUE)
[1] 0.6 0.5 0.3

Дополнительную информацию на русском языке о векторах и других объектах R можно найти здесь и здесь.

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


Комментариев нет :

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