Библиотека сайта rus-linux.net
Введение в базовые операции, функции и структуры данных GNU R
Оригинал: A quick GNU R tutorial to basic operations, functions and data structuresАвтор: Renata Rendek
Дата публикации: февраль 2013 года
Перевод: А. Кривошей
Дата перевода: апрель 2013 г.
1. Введение
Из двух предыдущих статей мы узнали, как установить и запустить GNU R в операционной системе Linux. Задача этой публикации - познакомить вкратце читателя с основными объектами языка программирования R. Мы изучим базовые операции R, функции и переменные. Далее мы ознакомимся со структурами данных R, объектами и классами.
2. Базовые операции в R
Начнем с простого математического примера. Наберите в консоли R семь плюс три и нажмите enter, в результате мы получим:
> 7+3 [1] 10
Чтобы объяснить более детально, что происходит и какую терминологию мы используем при работе с R, мы говорим, что интерпретатор R выводит объект, возвращаемый выражением, введенным в консоль R. Мы также говорим, что R интерпретирует любой объект как вектор. Поэтому "[1]" около нашего результата означает, что индекс первого значения, показанного в данной строке - один. Это можно пояснить, определив более длинный вектор с помощью функции c(). Пример:
>c(1:100) [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [19] 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 [37] 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 [55] 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 [73] 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 [91] 91 92 93 94 95 96 97 98 99 100
Операции можно выполнять и с векторами. Например, мы можем сложить два вектора:
> c(1,5,67,0)+c(0,1.5,6.7,3) [1] 1.0 6.5 73.7 3.0
В данном случае это означает сложение соответствующих элементов этих двух векторов. Если векторы имеют разный размер, то более короткий вектор повторяется несколько раз, и если длина более длинного вектора не кратна длине короткого, то выводится предупреждение:
> c(1,5,8,9)+c(0, 1.4) [1] 1.0 6.4 8.0 10.4 > c(1,5,8,9)+c(0, 1.4,7) [1] 1.0 6.4 15.0 9.0 Warning message: In c(1, 5, 8, 9) + c(0, 1.4, 7) : longer object length is not a multiple of shorter object length
Кроме того, в R мы можем определить символьные векторы:
> c("linuxcareer.com", "R tutorial") [1] "linuxcareer.com" "R tutorial"
Комментарии в R начинаются с символа "#":
> # This is a comment in R code
3. Функции и переменные
В R мы также можем определить или использовать предопределенные функции. Большинство функций в R определяются в следующей форме:
f(argument1, argument2,...)
Здесь "f" - это имя функции, а "argument1, argument2,..." - список аргументов функции. Например, используя некоторые встроенные функции, мы можем вычислить:
> sin(pi/2) [1] 1 > log(3) [1] 1.098612
В отличие от предыдущего примера, некоторые функции в R выражаются в форме операторов, таких как сложение, возведение в степень, равенство и т.д. Например, оператор равенства возвращает логическое значение (FALSE/TRUE):
> 4==4 [1] TRUE
Как и другие языки программирования, R использует переменные. Оператор присвоения здесь "<-" (или "="), например
> x<-c(1,4,7) > x+x [1] 2 8 14
Мы теперь можем ссылаться на третье значение вектора "x":
> x[3] [1] 7
или выбрать только члены, меньшие семи:
> x[x<7] [1] 1 4
Мы также, например, можем выбрать только первый и третий члены:
> x[c(1,3)] [1] 1 7
Таким образом, вы можете определять функции в R, просто называя их соответственно, а затем вызывать их аналогично встроенным функциям R. Например:
> myfunction<-function(x,y){x+y} > myfunction(4,5) [1] 9
Если вы захотите просмотреть код, относящийся к данной функции, просто введите ее имя:
> myfunction<-function(x,y){x+y} > myfunction(4,5) [1] 9
4. Структуры данных
В качестве первого примера структуры данных мы покажем, как определять матрицы (массивы), которые представляют собой многомерные векторы.
Мы можем, например, явно определить массив следующим образом:
> a<-array(c(1:24),dim=c(6,4)) > a [,1] [,2] [,3] [,4] [1,] 1 7 13 19 [2,] 2 8 14 20 [3,] 3 9 15 21 [4,] 4 10 16 22 [5,] 5 11 17 23 [6,] 6 12 18 24
Или мы можем сначала создать вектор, а затем использовать функцию matrix():
v<-c(1:24) > m<-matrix(data=v,nrow=6,ncol=4) > m [,1] [,2] [,3] [,4] [1,] 1 7 13 19 [2,] 2 8 14 20 [3,] 3 9 15 21 [4,] 4 10 16 22 [5,] 5 11 17 23 [6,] 6 12 18 24
Также возможно определить массив с количеством измерений больше двух.
> w<-array(v,dim=c(3,2,4)) > w , , 1 [,1] [,2] [1,] 1 4 [2,] 2 5 [3,] 3 6 , , 2 [,1] [,2] [1,] 7 10 [2,] 8 11 [3,] 9 12 , , 3 [,1] [,2] [1,] 13 16 [2,] 14 17 [3,] 15 18 , , 4 [,1] [,2] [1,] 19 22 [2,] 20 23 [3,] 21 24
Обращаемся к значению части массива, это просто:
> w[1,1,1] [1] 1 > w[1:2,1:2,1] [,1] [,2] [1,] 1 4 [2,] 2 5
Опуская индексы, получаем все элементы заданной размерности:
> w[,1,1] [1] 1 2 3
Теперь давайте посмотрим на более сложные структуры данных с более чем одним базовым типом данных. Такие типы данных называются списками. Списки в R могут содержать различные наборы объектов различного типа. Мы можем присваивать имя каждому компоненту списка, чтобы затем иметь возможность ссылаться на него. Например:
> l<-list(name="linuxcareer.com",visitors="10,000") > l $name [1] "linuxcareer.com" $visitors [1] "10,000"
Теперь мы можем ссылаться на компоненты списка по имени или местоположению, как показано ниже.
> l$visitors [1] "10,000" > l[1] $name [1] "linuxcareer.com" > l[[1]] [1] "linuxcareer.com"
Фрейм данных - это список, который содержит несколько именованных векторов одной длины. Это похоже на структуру баз данных. Давайте создадим фрейм данных, который содержит несколько валютных курсов (валюта/USD):
> currency<-c("Kroner", "Canadian $", "Hong Kong $", "Rupees") > date_090812<-c(6.0611,0.9923,7.7556,55.17) > date_100812<-c(6.0514,0.9917,7.7569,55.18) > exchangerate<-data.frame(currency,date_090812,date_100812) > exchangerate currency date_090812 date_100812 1 Kroner 6.0611 6.0514 2 Canadian $ 0.9923 0.9917 3 Hong Kong $ 7.7556 7.7569 4 Rupees 55.1700 55.1800
Теперь мы можем ссылаться на нужный нам элемент фрейма данных по его имени. Например, нам может понадобиться указать значение курса Hong Kong $/USD на 12.08.2012. Мы можем сделать это следующим образом:
>exchangerate$date_090812[exchangerate$currency=="Hong Kong $"] [1] 7.7556
5. Объекты и классы
R - это объектно-ориентированный язык программирования. Это означает, что каждый объект в R имеет тип является экземпляром класса. Чтобы узнать, экземпляром какого класса является данный объект, используется функция class():
> class(exchangerate) [1] "data.frame" > class(myfunction) [1] "function" > class(1.07) [1] "numeric"
В R не все функции принадлежат определенному классу, как в других объектно-ориентированных языках программирования. Однако здесь есть некоторые функции, которые тесно связаны с определенным классом. Они называются методами. В R методы вызывают обобщенные функции, имеющие одно и то же имя для разных классов. Это позволяет применять такие обобщенные функции к объектам различных типов. Например, "-" является обобщенной функцией для вычитания объектов. Вы можете вычитать числа, но можете также вычитать числа из даты:
> 4-2 [1] 2 > as.Date("2012-09-08")-2 [1] "2012-09-06"
6. Заключение
Целью этого руководства было представить язык программирования R для новичков, которые до этого не работали с R. Эта статья также может быть полезна в качестве справочного руководства для тех, кто изучает более сложные аспекты применения R для выполнения статистических расчетов. В следующей статье мы расскажем о том, как определять статистические модели и выполнять базовый статистический анализ в R, а также коснемся его графических возможностей в части визуализации результатов расчетов.