R
Материал из Xgu.ru
R — язык программирования, разработанный для целей статистической обработки данных, так же используется для работы со статистическими графиками и диаграммами.
Является частью платформы GNU. Широко используется во всевозможных областях как науки, так и техники. В TIOBE-индексе занимает 20-е место, при этом его популярность постоянно растёт. В других рейтингах положение его ещё лучше:
- 6 место в The 2015 Top Ten Programming Languages @ IEEE Spectrum[1];
- 10 место в PYPL PopularitY of Programming Language [2];
- 13 место в The RedMonk Programming Language Rankings, июнь 2015[3].
Содержание |
[править] Слабые стороны R
R это довольно специфичный язык, приступая к изучению и использованию которого, нужно иметь в виду:
- Среди тех, кто использует R и не только использует, но и разрабатывает пакеты R и даже сам R, очень много не программистов, а специалистов в статистике, математике или других областях. Это приводит к некоторым существенным последствиям для языка;
- Код на R часто неэлегантен и запутан;
- Разработчики кода R часто в большей степени ориентированы на результат (здесь и сейчас) чем на процесс (код должен жить и развиваться), в результате они пренебрегают такими вещами как контроль версий, тестирование кода и так далее;
- Пакеты R неконситстентны, они разрабатываются разными людьми, под разные версии R, и это продолжается на протяжении огромного периода времени, который уже насчитывает более 20 лет;
- Скорость работы программ на R часто оставляет желать лучшего.
[править] Основные типы данных
Атомарные типы:
- символьный (character);
- числовой (numeric, действительные числа);
- целый (integer);
- комплексный (complex);
- логический (logical, True/False).
[править] Векторы и списки
Вектор:
> 2:5 [1] 2 3 4 5 > c(0,1,2,3,4,5) [1] 0 1 2 3 4 5
Автоматическое преобразование типов элементов (coercion):
> c(0,TRUE,"a") [1] "0" "TRUE" "a"
Обратите внимание, что каждый элемент превратился в строку (character).
Явное преобразование типов:
> as.character(0:10) [1] "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" > as.logical(0:3) [1] FALSE TRUE TRUE TRUE
Список (list):
> x <- list( 1, "a", TRUE, 1 + 4i ) > x [[1]] [1] 1 [[2]] [1] "a" [[3]] [1] TRUE [[4]] [1] 1+4i > x[1] [[1]] [1] 1 > x[2] [[1]] [1] "a" > x[3] [[1]] [1] TRUE > x[2:3] [[1]] [1] "a"
[править] Матрицы
> y<-matrix(1:20, nrow=5,ncol=4) > y [,1] [,2] [,3] [,4] [1,] 1 6 11 16 [2,] 2 7 12 17 [3,] 3 8 13 18 [4,] 4 9 14 19 [5,] 5 10 15 20
Матрица с именованными колонками и строчками:
> cells <- c(1,26,24,68) > cells [1] 1 26 24 68 > rnames <- c("R1", "R2") > cnames <- c("C1", "C2") > cells <- c(1,26,24,68) > mymatrix <- matrix(cells, nrow=2, ncol=2, dimnames=list(rnames, cnames)) > mymatrix C1 C2 R1 1 24 R2 26 68
Перевернуть колонки и строчки местами (с помощью byrow=TRUE):
> mymatrix <- matrix(cells, nrow=2, ncol=2, byrow=TRUE, dimnames=list(rnames, cnames)) > mymatrix C1 C2 R1 1 26 R2 24 68
- Quick-R: Matrix Algebra (англ.) — алгебраические операции с матрицами в R
[править] Факторы
Фактор это вектор, значения которого могут быть равными элементам определённого множества.
> factor( c("a", "a", "b") ) [1] a a b Levels: a b
Элементы этого множества можно получить с помощью levels:
> a <- factor( c("a", "a", "b") ) > levels(a) [1] "a" "b"
Их можно не только просматривать, но и менять. При этом меняются соответствующие значения в факторе:
> levels(a)[1] <- "A" > a [1] A A b Levels: A b
Значениям фактора можно присваивать метки, labels:
> a <- factor( c(1,2,3,2,1,1,1), levels=1:3, labels=c("A", "B", "C") ) > a [1] A B C B A A A Levels: A B C
Частоты элементов фактора можно определить с помощью table:
> table(a) a A B C 4 2 1
[править] Фреймы
Фреймы, один из важнейших типов данных в R. Фреймы это как матрицы, но только с разными типами колонок.
> d <- c(1,2,3,4) > e <- c("red", "white", "red", NA) > f <- c(TRUE, TRUE, TRUE, FALSE) > mydata <- data.frame(d,e,f) > names(mydata) <- c("ID", "Color", "Passed") > mydata ID Color Passed 1 1 red TRUE 2 2 white TRUE 3 3 red TRUE 4 4 <NA> FALSE > mydata[1:2] ID Color 1 1 red 2 2 white 3 3 red 4 4 <NA> > mydata[c("ID", "Color")] ID Color 1 1 red 2 2 white 3 3 red 4 4 <NA> > summary(mydata) ID Color Passed Min. :1.00 red :2 Mode :logical 1st Qu.:1.75 white:1 FALSE:1 Median :2.50 NA's :1 TRUE :3 Mean :2.50 NA's :0 3rd Qu.:3.25 Max. :4.00
Обращение к конкретным элементам фрейма:
> mydata$ID [1] 1 2 3 4 > mydata$Color [1] red white red <NA> Levels: red white
Учитывая, что все операции в R так же являются функциями, можно обращаться следующим образом:
`$`( mydata, "Color" )
Однако это не означает, что можно обращаться к аргументам, названия которых находятся в переменных (в данном примере он в attribute_name). Такой пример работать НЕ будет:
`$`( mydata, attribute_name )
Подробнее: [1].
[править] data.table
Примеры операций:
DT2 = DT[,w:=x+y]
Добавляет новый столбец, который равен сумме столбцов x и y.
DT3 = DT2[,a:=x>10]
Добавляет новый логический столбец, который содержит булеву переменную указывающую больше столбец x чем 10 или нет.
DT4 = DT3[,b:=mean(x+y),by=a]
Добавляет столбец b, который равен среднему суммы столбцов x и y, но при этом данные сгруппированы по a, то есть значения для a=TRUE и a=FALSE будут соответствующими.
DT <- data.table(x=sample(letters[1:3], 1E5, TRUE)) DT[,.N, by=x]
Считает количество строк, сгруппированных по x (перед этим записываются случайные буквы a,b,c 10000 раз). Преимущество dataframe заключается в том, что эта операция выполняется очень быстро.
[править] Программные конструкции
[править] Циклы
- for
- while
- repeat
[править] Условия
- if
[править] Функции
- Вариадические функции
- Именованные параметры
- First-class-function
- Параметры проверяются только тогда, когда используются
Пример описания функции:
f <- function(x) x^2
Или так:
f <- function(x) { x^2 }
Пример замыкания (closure) в R:
power <- function(exponent) { function(x) { x ^ exponent } }
Элементы функционального программирования в R:
- Functional programming (англ.)
- Functional programming in R (англ.)
[править] Чтение данных различных форматов
[править] Работа с локальными файлами
- getwd() узнать текущий каталог
- setwd() установить текущий каталог
- file.exists(file) проверить, существует ли файл;
- dir.create(dir) создать каталог
- list.files(dir) получить список файлов в каталоге dir
- read.table(file) считать таблицу из файла в память
[править] Скачивание файлов из Интернета
- download.file(url, method=method) — скачать файл из Интернета; в качестве метода может быть, например, curl
[править] JSON
library(jsonlite) jsonData <- fromJSON("http://url/to/file.json") names(jsonData)
Доступ внутрь данных JSON:
jsonData$key1$subkey1
Просмотреть JSON-данные в формате JSON:
cat(jsonData)
Подробнее:
[править] XML
library(XML) doc <- xmlTreeParse(fileUrl, useInternal=TRUE) rootNode <- xmlRoot(doc) xmlName(rootNode)
Для выполнения поиска по документу XML можно использовать XPath:
xpathSApply(rootNode, "//name", xmlValue )
[править] XLSX (Excel)
library(xlsx) data <- read.xlsx("file.xlsx", sheetIndex=1, header=TRUE)
read.xlsx2 намного быстрее, но не такой гибкий.
Кроме этого есть ещё модуль XLConnect, который позволяет выполнять разнообразные манипуляции с XLSX-файлами.
Но лучше всего сохранять файлы в CSV-формате.
Дополнительная информация:
- xlsx vignette (англ.)
- XLConnect vignette (англ.)
[править] Графики
Несколько советов по созданию графиков:
- Показывать разницу, сравнивать два или несколько различных вариантов;
- Показывать причинно-следственную связь и механизм влияния;
- Показывать многовариантные данные;
- Объединять различные способы донесения и представления данных;
- Описывать и документировать;
- Самое главное это данные.
Великий графикостроитель Эдвард Туфте:
[править] Простейшие обзорные графики
Гистограмма:
hist(a, breaks=100)
Добавить полоски, показывающие распределние:
rug(a)
Ящик с усами, диаграмма размаха (англ. boxplot), ящик с усами придуман Джоном Тьюки в 1970-х годах:
boxplot(a)
Столбчатая диаграмма (англ. barplot):
barplot( table(a) )
Многовариантный ящик с усами:
boxplot( a ~ region, data=pollution, col="red" )
Здесь из таблицы a берётся колонка pollution, группируется по полю region и результат представляется в виде нескольких ящиков с усами.
Диаграмма рассеяния (англ. scatterplot):
with( pollution, plot( latitute, pm25 ) )
Раскрасить разные регионы (поле region) разным цвтом:
with( pollution, plot( latitute, pm25, col=region ) )
[править] Системы построения графиков в R
- обычная (canvas)
- lattice (решётчатая) — xyplot, bwplot и так далее — удобна тем, что позволяет построить множество графиков сразу
- ggplot2 — похожа на lattice, но много удобных настроек по умолчанию
Системы эти не могут использоваться совместно, то есть, если график строится, например, с помощью lattice, вы не можете на него наложить элементы ggplot2.
Примеры:
library(lattice) state <- data.frame(state.x77, region = state.region) xyplot(Life.Exp ~ Income | region, data = state, layout = c(4,1))
library(ggplot2) data(mpg) qplot(displ, hwy, data = mpg)
[править] Команды для построения графиков
- plot — построить диаграмму рассеяния
- lines — добавить линии
- points — добавить точки
- text — добавить текст-аннотацию
- title — добавить заголовок
- mtext — добавить текст в отступы графика (внутренний и внешний)
- axis — добавить название осей и отметок на осях
- legend — добавить легенду на график
library(datasets) with(airquality, plot(Wind, Ozone, main = "Ozone and Wind in New York City", type="n")) with(subset(airquality, Month == 5), points(Wind, Ozone, col = "blue")) with(subset(airquality, Month == 5), points(Wind, Ozone, col = "red")) legend("topright", pch =1, col= c("blue", "red"), legend = c("May", "Other Months"))
Добавить регрессионную линию:
model <- lm( Ozone ~ Wind, airqulity ) abline( model, lwd = 2 )
Несколько графиков на одном:
par(mfrow = c(1,2)) with(airquality, { plot(Wind, Ozone, main = "Ozone + Wind") plot(Solar.R, Ozone, main = "Ozone + Radiation") })
Посмотреть примеры по каждой команде можно:
example(points)
[править] Графические устройства в R
- экран
- PDF (файл, растровая графика)
- PNG или JPEG (файл, растровая графика)
- SVG (файл, векторная графика)
Устройство screen называется в разных операционных системах по-разному:
- Mac: quartz()
- Windows: windows()
- Unix/Linux: x11()
Полный список устройств:
?Devices
По умолчанию искользуется устройство типа screen.
Пример построения графика на экране:
library(datasets) with(faithful, plot(eruptions, waiting)) title(main = "Plot Title Example")
Пример построения графика в файле:
pdf(file="my.pdf") with(faithful, plot(eruptions, waiting)) title(main = "Plot Title Example") dev.off()
После закрытия устройства dev.off() файл my.pdf готов к использованию.
Названия основных устройств:
Векторные форматы:
- svg
- postscript
Растровые форматы:
- png
- jpeg
- tiff
- bmp
Несколько устройств можно открыть одновременно, но работа всё равно ведётся с одним, с активным. Активное устройство можно определить с помощью dev.cur().
Выбрать устройство можно с помощью dev.set(номер).
Сохранить график с одного устройства (например, с экрана) на другое (например, в файл) можно с помощью dev.copy или dev.copy2pdf:
## график на экране, а теперь сохраняем его dev.copy(png, file="my.png") dev.off()
[править] Линейная регрессия
Важные функции:
- lm
- predict
- resid
- Fit models to data (англ.)
[править] Пример использования
Построение круговой диаграммы:
png(filename = "Rplot2.png", width = 640, height = 640, pointsize = 12, bg = "white") pie.sales <- c(27,37,36) names(pie.sales) <- c("No HW virtualization", "Intel Vanderpool", "AMD Pacifica") pie(pie.sales) title(main="September 2007 Kiev CPU HVM features", cex.main=1.8, font.main=1) title(xlab="(according to itc.ua)", cex.lab=0.8, font.lab=3) dev.off() q()
Полученный скрипт можно вызвать на обработку таким образом (при условии, что он находится в файле chart.r):
R --no-save < chart.r
В результате в файле Rplo2.png будет находиться рисунок (справа).
[править] Дополнительная информация
- http://www.r-project.org/ — домашний сайт проекта
- R Tutorial (англ.), учебник по R от Kelly Black, Department of Mathematics, Uniersity Georgia
- Quick-R (англ.) — подборка материалов по R от автора книги R in Action
На русском:
- Анализ данных — Статьи Евгения Балдина, посвящённые R
- Язык программирования R (рус.) — книга по R, находится в процессе перевода
- Введение в R (рус.)
Другие материалы:
Создание графиков и диграмм:
- Creating Charts and Graphs with GNU R (англ.)
- How to save graphs in files (англ.)
- How can I save my data and graphs in a different format? (англ.)
- Color Chart (англ.) — цвета, которые можно использовать в R
[править] Дополнительная информация
- BioConductor Packages (англ.) — огромная коллекция пакетов R для бионинформатики
- Task Views (англ.) — Сгруппированные по категориям пакеты R
[править] Книги
Data Science:
- Statistical inference for data science (англ.) — книга на LeanPub
[править] Вопросы и ответы
[править] Как инсталлировать дополнительные пакеты?
Инсталляция:
install.packages("Hmisc")
Загрузка:
library(Hmisc)
Выбор репозитория, из которого будет производиться инсталляция:
chooseCRANmirror()
Если при инсталляции используется прокси:
Sys.setenv(http_proxy="http://MyLoGiN:MyPaSs@1ncproxy1:80")
(или просто установить соответствующую переменную окружения).
Дополнительная информация:
- http://de.wikibooks.org/wiki/GNU_R:_install.packages
- http://de.wikibooks.org/wiki/GNU_R:_chooseCRANmirror
- http://rwiki.sciviews.org/doku.php?id=getting-started:installation:packages