ИАД. 1. Введение в систему R
![]()
|
1 2 1. Введение в систему R 1.1. Основы работы с системой R При запуске программы RGui появляется основное окно программы, содер- жащее подокно, называемое R Console. Это командное окно (консоль), в кото- ром пользователь вводит команды, а система печатает результаты. В процессе работы в основном окне будет появляться другие окна, в частности, окна ре- дактора скриптов, графические окна, в которых изображаются графические результаты выполнения команд, и др. Команды вводятся пользователем (в командном окне) после приглашения, которое имеет вид > Команда поступает системе на обработку, как только пользователь нажал Enter . В одной строке можно набрать несколько команд, разделяя их сим- волом ; (точка с запятой). Если клавиша Enter нажата, а команда еще не завершена, то приглашение приобретает вид + В дальнейшем тексте любая строка, начинающаяся с >, означает клавиатур- ный ввод: вам необходимо набрать то, что напечатано после >, но без знака >. Символ + продолжения команды в настоящем тексте мы будем всегда опус- кать. Часть строки, начинающаяся с символа # и заканчивающаяся концом стро- ки (там, где вы нажали Enter), — это комментарии. Они игнорируются си- стемой. Чтобы получить справку о функции, имя которой вам известно, нужно набрать > help(имя-функции) Имя интересующей вас функции может стоять в кавычках (одинарных или двойных) или без кавычек. Например, > help("lm") > help(’lm’) > help(lm) Если справка по указанной функции имеется, то откроется новое окно с со- держимым этой справки. Справка доступна также через пункт меню Help. R поддерживает работу с историей команд. В командной строке с помо- щью клавиш «стрелка вверх» и «стрелка вниз» можно прокручивать (в обоих направлениях) список всех введенных ранее команд. Как только нужная ко- манда найдена, ее можно отредактировать, используя клавиши Del, «стрелка влево», «стрелка вправо» и алфавитно-цифровые клавиши. Если команды записаны в некотором файле, например, myprog.r, то запу- стить из на выполнение можно с помощью команды > source("myprog.r") Эта возможность доступна также через меню File. Чтобы перенаправить весь вывод в файл, скажем, myprog.out, восполь- зуйтесь командой > sink("myprog.out") Восстановить вывод на консоль можно командой > sink() Для выхода из R нужно набрать > q() или воспользоваться меню. 1.2. Числа Основным типом данных в системе R является число с плавающей точкой двойной точности. Для отделения дробной части от целой используется точ- ка. Показатель отделяется от мантиссы символом e или E. Например, 31415, +3.1415e4 , .31415e+5, 3141500e-2 — разные записи одного и того же числа 31415. Над числами можно выполнять обычные арифметические операции: +, -, * , /, ^ (степень), %/% (целочисленное деление), %% (остаток от деления). Опера- ции имеют обычный приоритет. В выражениях используются круглые скобки. Набранное в командной строке арифметическое выражение после нажатия на Enter вычисляется и результат сразу же отображается: > 2*(7-9)^8+6/3 [1] 514 Ответ — это 514. Смысл [1] будет ясен из дальнейшего. Элементарные функции, разумеется, реализованы. Вот (неполный) список: абсолютное значение abs, квадратный корень sqrt, экспонента e x exp , нату- ральный логарифм ln x log, десятичный логарифм log 10 x log10, двоичный логарифм log 2 x log2, тригонометрические функции sin, cos, tan, обратные тригонометрические функции asin, acos, atan. Аргумент функций записыва- ется в круглых скобках. Например, > exp(1) [1] 2.718282 > (sqrt(5) + 1)/2 [1] 1.618034 > sin(pi/2) [1] 1 3 где pi — это константа π. Если у функции несколько аргументов, то они отделяются знаком , (запятая). Например, atan2(y, x) возвращает угол между осью Ox и вектором (x, y). Доступны следующие функции округления. Функция ceiling(x) нахо- дит минимальное целое, не меньшее x (округление в сторону +∞). Функция floor(x) возвращает максимальное целое, не превосходящее x (округление в сторону −∞). Функция trunc(x) отбрасывает дробную часть (округление в сторону 0). Функция round(x) округляет к ближайшему целому. Функция round(x, dig) с дополнительным параметром dig указывает, что необходимо осуществить округление до заданного знака после запятой. Особую роль в R играют следующие объекты: бесконечность Inf, «не- число» NaN, «отсутствующее значение» NA. Бесконечность Inf (может иметь также отрицательный знак) получается при переполнениях и операциях ви- да 1/0 и т. п. «Не-число» NaN возникает как результат операций вида 0/0, Inf-Inf и т. п. Если в результате вычислений получается NaN, то R выдает предупреждение. Значение NA (not available) означает, что значение не до- ступно. Пользователь сам может в выражениях использовать Inf, NaN и NA. Любое числовое значение можно приписать какой-либо переменной. Эту переменную можно использовать в последующих командах 1 . Например, > x <- sqrt(5) > phi <- (x + 1)/2 Здесь x и phi — это имена переменных, а знак <-, означающий присваива- ние 2 , состоит из двух символов: < и -. Заметим, что присваиваемые значения не будут напечатаны в командном окне. Чтобы посмотреть на присвоенное значение, нужно еще раз набрать имя переменной. Например, > phi [1] 1.618034 Имена переменных (идентификаторы) в R состоят из строчных и заглав- ных букв 3 , цифр и знаков . (точка) и _ (подчеркивание). Идентификатор не может начинаться с цифры, и если он начинается с точки, то цифра не мо- жет быть его вторым символом 4 . R чувствителен к регистру, т. е. строчные и заглавные буквы в нем различаются. Например, имена phi и Phi относятся к разным переменным. Список всех имеющихся на данный момент переменных можно получить с помощью функции ls(). Удалить переменную можно с помощью функции 1 Никогда ничего не присваивайте переменной pi. Иначе у вас не будет доступа к кон- станте π. 2 Вместо <- можно использовать =. Кроме того, возможно присваивание в виде (x + 1)/2 -> phi. 3 Можно даже использовать кириллицу, если ваша операционная система ее поддержи- вает, но для переносимости программ лучше этого не делать. 4 Мы были удивлены, когда обнаружили, что в R возможны переменные, имена которых состоят только из точек — по-видимому, из любого их количества, но не трех. Лексема ... в R используется для других целей. Разумеется, мы не рекомендуем использовать переменные с такими именами. 4 ls() rm() , перечислив в списке аргументов имена переменных, подлежащих уда- лению. 1.3. Числовые векторы Векторы в R формируются функцией c(). Аргументы этой функции суть компоненты вектора. Например, команда > c(1, 2, 3, 4, 5) [1] 1 2 3 4 5 формирует вектор-строку (1, 2, 3, 4, 5). Разумеется, векторы можно при- сваивать переменным: > a = c(1, 2, 3, 4, 5) Аргументами функции c() могут являться векторы. В этом случае как результат получаем конкатенацию этих векторов. Скалярные значения (т. е. числа) воспринимаются R как векторы длины 1. Таким образом, аргументами функции c() могут быть как векторы, так и скаляры. Например, > c(c(1, 2, 3, 4, 5), 6, c(7, 8)) [1] 1 2 3 4 5 6 7 8 Вектор, состоящий из последовательных чисел, можно получить с помо- щью команды <начальное-значение>:<конечное-значение>. Например, 1:5. На эту команду похожа функция seq, которая генерирует отрезки арифмети- ческой прогрессии. Можно задать начальное значение, конечное значение и шаг: > seq(0, 1, by = 0.1) [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 В другом варианте задается начальное значение, конечное значение и количе- ство точек. В результате будет сгенерирован вектор, состоящий из заданного числа компонент, равномерно распределенных на заданном отрезке: > seq(0, 1, len = 11) [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 Функция rep(v, k) создает вектор, состоящий из k копий вектора v. На- пример, > rep(c(1, 2), 3) [1] 1 2 1 2 1 2 Функция runif(n) создает вектор указанной длины со случайными эле- ментами, равномерно распределенными на отрезке [0, 1] Функция rnorm(n) создает вектор указанной длины n со случайными элементами, распределен- ными по нормальному закону с математическим ожиданием 0 и дисперсией 1. Элементы вектора могут иметь значения Inf, NaN, NA. Например, 5 rm() , c() seq , rep(v, k) runif(n) создает rnorm(n) > age = c(23, NA, NA, 18, 19) Над векторами можно выполнять арифметические операции и элементар- ные функции. Бинарная операция над двумя векторами одинаковой длины производится почленно над каждой парой элементов, и результатом является вектор, состоящий из результатов этого действия. В случае, когда размерность векторов не совпадает, производится приведение длины более короткого век- тора к длине длинного. Приведение выполняется следующим образом: вектор приобретает длину, такую же, как и у более длинного, и содержимое этих новых элементов берётся из содержимого старых элементов вектора, повто- ряемых циклически. > c(1, 2, 3, 4) + c(1, 2) [1] 2 4 4 6 > c(1, 2, 3, 4) - c(1, 2) [1] 0 0 2 2 > c(1, 2, 3, 4) * c(1, 2) [1] 1 4 3 8 > c(1, 2, 3, 4)/c(1, 2) [1] 1 1 3 2 > c(1, 2, 3, 4)^c(1, 2) [1] 1 4 3 16 > c(1, 2, 3, 4)/c(1, 0) [1] 1 Inf 3 Inf > 2*c(1, 2, 3, 4, 5) [1] 2 4 6 8 10 Если длина короткого вектора не кратна длине более длинного, то выдается предупреждение, но результат вычисляется. Например, > c(3, 1, 4, 1, 5, 9, 2) + c(9, 5) [1] 12 6 13 6 14 14 11 Элементарные математические функции применяются к каждой компо- ненте вектора. Например, > x = c(0, pi/2, pi) > sin(x) [1] 0.000000e+00 1.000000e+00 1.224606e-16 Доступ к элементам вектора осуществляется оператором [i]. Например, u[5] — это 5-й элемент вектора u. Нумерация элементов начинается с 1. Вы- ражения вида u[i] могут встречаться и в левой части от знака присваивания. При этом если вектор имеет длину не меньше i, то u[i] просто примет новое значение. В противном случае вектор u увеличит свою длину до i, компонента u[i] примет новое значение, а остальные новые компоненты примут значения NA > u <- 1 6 Бинарная операция над двумя векторами одинаковой длины производится почленно над каждой парой элементов, и резуль резу резу татом является вектор, состоящий из резуль резу резу татов этого действия. В случае, когда ог размерность векторов не совпадает, производится приведение длины более короткого век- тора к длине длинного. Элементарные математические функции применяются к каждой компо- ненте вектора. Доступ к элементам вектора осуществляется оператором [i]. > u[5] <- 5 > u [1] 1 NA NA NA 5 Некоторые полезные функции: sum(v) — сумма элементов вектора v; prod(v) — произведение компонент вектора v; max(v) — максимальный элемент; min(v) — минимальный элемент; length(v) — длина вектора; mean(v) — среднее значение элементов вектора v (оценка математического ожидания); var(v) — вариация элементов вектора v (оценка дисперсии); sort(v) — возвращает вектор той же длины, что и v, с элементами, отсор- тированными в порядке возрастания. 1.4. Логические векторы R умеет работать с логическими векторами (и, следовательно, с логиче- скими скалярми), элементы которого могут иметь значения TRUE и FALSE, а также значение NA. Логические векторы получаются в результате сравнений и применения к логическим векторам логических функций. Операции сравне- ния — это <, <=, >, >=, == (для равенства) и !=(для неравенства). Логические функции — это & (и), | (или), ! (не). Операнды могут иметь разную длину. Сравнения и логические функции выполняются покомпонентно и, если тре- буется, с циклическим сдвигом, как и в случае арифметических операций. Например, > young <- (age >= 2) & (age <= 50) создает логический вектор young той же длины, что и age, с компонентами, равными TRUE, где условие выполнено, и FALSE, где условие не выполнено. > age = c(1, 2, NA, Inf, NaN, 18, 19) > young <- (age >= 2) & (age <= 50) > young [1] FALSE TRUE NA FALSE NA TRUE TRUE Логические векторы могут использоваться в обычной арифметике. При этом TRUE интерпретируется как 1, а FALSE как 0. Функция is.na(a) возвращает логический вектор той же длины, что и a, с компонентами, равными FALSE, где соответствующие значения a равны NaN или NA, и TRUE в остальных случаях. Функция is.nan(a) возвращает логи- ческий вектор той же длины, что и a, с компонентами, равными FALSE, где соответствующие значения a равны NaN, и TRUE в остальных случаях. Напри- мер, > a = c(0, 1, Inf, NaN, NA) 7 sum(v) prod(v) max(v) min(v) length(v) mean(v) var(v) — sort(v) is.na(a) is.nan(a) > is.na(a) [1] FALSE FALSE FALSE TRUE TRUE > is.nan(a) [1] FALSE FALSE FALSE TRUE FALSE 1.5. Символьные векторы Чтобы определить в R строку символов, достаточно заключить ее в двой- ные или одинарные кавычки. При этом \n означает переход на новую строку, \t — табуляцию, \b — возврат на символ назад, \\ — символ \, \" — символ ", \’ — символ ’. Из отдельных строк можно компоновать векторы. Например, > label = c("Petal width", "Petal length") > label [1] "Petal width" "Petal length" Конкатенацию строк осуществляет функция paste. В простейшем вари- анте, например, происходит склейка указанных строк со вставкой в качестве разделителя пробела. Например, > paste("Sepal width", "Sepal length", "Petal width", "Petal length") [1] "Sepal width Sepal length Petal width Petal length" Если аргументы функции paste — массивы, то склеиваются соответствующие компоненты. При этом, если длины массивов различны, происходит цикличе- ская подстановка меньшего из них. Например, > paste(c("Sepal", "Petal"), c("width", "length")) [1] "Sepal width" "Petal length" > paste(c("Sepal", "Petal"), c("width", "width", "length", "length")) [1] "Sepal width" "Petal width" "Sepal length" "Petal length" Если один из векторов — числовой, то он автоматически будет конвертирован в символьный: > paste("x", 1:5) > [1] "x 1" "x 2" "x 3" "x 4" "x 5" Можно заменить разделитель на другой: > paste("x", 1:5, sep = "") > [1] "x1" "x2" "x3" "x4" "x5" 8 paste 1.6. Строковые наименования элементов вектора Элементам вектора (числового, логического, символьного) можно задавать имена. Например, > fruit <- c(5, 10, 1, 20) > names(fruit) <- c("orange", "banana", "apple", "peach") > fruit orange banana apple peach 5 10 1 20 Мы создали вектор длины 4, компоненты которого имеют указанные назва- ния. Теперь обращаться к элементам вектора можно как по индексу, так и по имени: > fruit[1] <- 6 > fruit["peach"] <- 60 > fruit orange banana apple peach 6 10 1 60 1.7. Векторы в качестве индексов Пусть v — некоторый вектор (числовой, логический, символьный). Напом- ним, что обращение к конеретному элементу этого вектора осуществляется с помощью команды индексирования v[i]. Оказывается, что в качестве индекса i здесь может выступать не скаляр, а вектор. В этом случае генерируется срез исходного вектора v, состоящий из тех его компонент, которые удовлетворяют определенным условиям. Как будет интерпретирован вектор, рассматриваемый в качестве индекса, зависит от его типа. Возможны следующие случаи. • i — это логический вектор. В этом случае длины векторов i и v должны совпадать. В результате v[i] — это вектор, сформированный из тех и только тех компонент вектора v, для которых соответствующее значение в i есть TRUE. • i — это вектор с положительными целыми значениями. В этом случае компоненты вектора i интерпретируются как обычные индексы и v[i] — это вектор, сформированный из соответствующих компонент вектора v в той последовательности, в которой они указаны в i. • i — это вектор с отрицательными целыми значениями. Абсолютные зна- чения вектора i интерпретируются как номера компонент, которые ис- ключаются из v. • i — это символьный вектор. Его значения интерпретируются как имена компонент вектора v. В результате v[i] — это вектор, сформированный 9 names(fruit) fruit[1] fruit["peach"] из соответствующих компонент вектора v в той же последовательности, в которой они указаны в i. Рассмотрим примеры: > y <- x[!is.na(x)] формирует вектор y только из инициализированных некоторым значением (не NaN и NA) компонент вектора x. Команда > x[is.na(x)] <- 0 заменяет отсутствующие значения нулями. Выражение > z <- (x + 1)[(!is.na(x)) & x > 0] создает вектор z и размещает в нем элементы вектора x + 1, удовлетворяю- щие приведенным условиям. Команда > x[1:10] формирует вектор из первых 10 компонент вектора x (предполагается, что длина вектора x больше 10). Команда > x <- x[-(1:5)] удаляет из x первые 5 компонент. Приведем еще один пример. Пусть f — вектор, содержащий протабули- рованные значения некоторой функции в точках, хранящихся в x. Требуется найти корни функции. Это можно сделать следующим образом: > n <- length(x) > w <- 1:(n - 1) > x(f[w] == 0 | (f[w]*f[w + 1] < 0)) 1.8. Графики функций Для изображения графиков функций в R есть функция plot(x, y). Здесь x — вектор значений абсцисс и y — вектор значений ординат. Если указан только один аргумент — plot(y), то предполагается, что x=1:n, где n — длина вектора y. Например, команды > x = seq(-pi, pi, len = 30) > y = sin(x) > plot(x, y) 10 x[is.na(x)] <- 0 Приведем еще один пример. Пусть f — вектор, содержащий протабули- абу абу рованные значения некоторой функции в точках, хранящихся в x x . Требуется найти корни функции. Это можно сделать следующим образом: > n <- length(x) > w <- 1:(n - 1) > x(f[w] == 0 | (f[w]*f[w + 1] < 0)) plot(x, y) −3 −2 −1 0 1 2 3 −1.0 −0.5 0.0 0.5 1.0 x y Рис. 1.1. «Точечный» график синуса рисуют 30 точек, лежащих на синусоиде y = sin(x); см. рис. 1.1. Графики по- явлются в отдельном окне (или в нескольких отдельных окнах), называемых графическими устройствами. Функция plot допускает множество дополнительных параметров. Вот неко- торые из них. • log = "x" или log = "y" или log = "xy" делает соответственно мас- штаб по оси абсцисс, ординат или по обеим осям логарифмическим; • type = тип-графика позволяет указать тип выводимого графика; неко- торые значения параметра — "p" (точки, по умолчанию), "l" (линии), "b" (линии и точки), "o" (линии и точки перекрываются), "n" (ничего не рисуется); • xlab = название-оси-абсцисс и ylab = название-оси-ординат позво- ляет указать подписи к оси абсцис и ординат соответственно; • main = основная-надпись и sub = дополнительная-надпись создают над- писи сверху и снизу графика; • col = цвет задает цвет графика; возможны значения "blue", "red", "green" , "cyan", "magenta", "yellow", "black" и многие другие. Можно 11 log type xlab main col −3 −2 −1 0 1 2 3 −1.0 −0.5 0.0 0.5 1.0 1 2 |