R

Материал из Xgu.ru

Перейти к: навигация, поиск
stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.

Если вы считаете, что её стоило бы доработать как можно быстрее, пожалуйста, скажите об этом.


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

[править] Факторы

Фактор это вектор, значения которого могут быть равными элементам определённого множества.

> 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:

[править] Чтение данных различных форматов

[править] Работа с локальными файлами

  • 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-формате.

Дополнительная информация:

[править] Графики

Несколько советов по созданию графиков:

  1. Показывать разницу, сравнивать два или несколько различных вариантов;
  2. Показывать причинно-следственную связь и механизм влияния;
  3. Показывать многовариантные данные;
  4. Объединять различные способы донесения и представления данных;
  5. Описывать и документировать;
  6. Самое главное это данные.

Великий графикостроитель Эдвард Туфте:

[править] Простейшие обзорные графики

Гистограмма:

 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 готов к использованию.

Названия основных устройств:

Векторные форматы:

  • 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

[править] Пример использования

Пример построения круговой диаграммы с помощью R

Построение круговой диаграммы:

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

На русском:

Другие материалы:



Создание графиков и диграмм:

[править] Дополнительная информация

  • BioConductor Packages (англ.) — огромная коллекция пакетов R для бионинформатики
  • Task Views (англ.) — Сгруппированные по категориям пакеты R

[править] Книги

Data Science:

[править] Вопросы и ответы

[править] Как инсталлировать дополнительные пакеты?

Инсталляция:

 install.packages("Hmisc")

Загрузка:

 library(Hmisc)

Выбор репозитория, из которого будет производиться инсталляция:

 chooseCRANmirror()

Если при инсталляции используется прокси:

 Sys.setenv(http_proxy="http://MyLoGiN:MyPaSs@1ncproxy1:80")

(или просто установить соответствующую переменную окружения).

Дополнительная информация:

[править] Примечания

  1. http://spectrum.ieee.org/computing/software/the-2015-top-ten-programming-languages
  2. http://pypl.github.io/PYPL.html
  3. http://redmonk.com/sogrady/2015/07/01/language-rankings-6-15/
Источник — «http://5.9.243.178:81/wiki/R»