Наши партнеры

UnixForum





Библиотека сайта 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, а также коснемся его графических возможностей в части визуализации результатов расчетов.