Similar presentations:
Манипулирование данными в R
1. Манипулирование данными в R
Манипулирование даннымивR
2. Сортировка. Функция order
• Упорядочение лучше производить косвенно:найти вектор индексов, на котором выполнять
операцию сортировки, и использовать его для
всех векторов, которые должны изучаться в
совокупности. Функция order позволяет
сортировать в порядке следования аргументов –
первый аргумент - вектор индексов, который
сортируется в порядке возрастания, затем
сортировка производится по второму аргументу
и т.д.
3. Пример
> x <- sample(1:5, 20, rep=T)> y <- sample(1:5, 20, rep=T)
> z <- sample(1:5, 20, rep=T)
> xyz <- rbind(x, y, z)
> dimnames(xyz)[[2]] <- letters[1:20]
> xyz
abcdefghijklmnopqrst
x44243441225315534534
y55252354424214344222
z45324245524245343443
> o <- order(x, y, z)
> xyz[, o]
mhjcilesptfqdagbrokn
x11222333344444445555
y14224222423455552344
z45235244432324454345
4. Функция sort
• Функция sort сортирует вектор или список ввозрастающем или убывающем
> sort(x)
[1] 1 1 2 2 2 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5
> sort(x,decreasing=T)
[1] 5 5 5 5 4 4 4 4 4 4 4 3 3 3 3 2 2 2 1 1
Чтобы отсортировать часть вектора, используется
аргумент the partial
> sort(x,partial=c(3,4))
[1] 1 1 2 2 3 4 4 4 2 4 5 3 4 5 5 3 4 5 3 4
5. Функция rank
• Чтобы вывести ранг значений вектора, используется функция rank. Поумолчанию ранг одинаковых элементов усредняется, но можно использовать
другие опции: брать первое значение, случайное значение, максимум или
минимум.
x44243441225315534534
> rank(x)
[1] 13.0 13.0 4.0 13.0 7.5 13.0 13.0 1.5 4.0 4.0
[11] 18.5 7.5 1.5 18.5 18.5 7.5 13.0 18.5 7.5 13.0
> rank(x, ties="first") # first occurrence wins
[1] 4 4 2 4 3 4 4 1 2 2 5 3 1 5 5 3 4 5 3 4
> rank(x, ties="random") # ties broken at random
[1] 16 15 5 14 9 12 11 1 3 4 19 6 2 17 18 8 13 20 7 10
> rank(x, ties="min") # typical sports ranking
[1] 10 10 3 10 6 10 10 1 3 3 17 6 1 17 17 6 10 17 6 10
6. Дата и время
• В R есть несколько механизмов дляпредставления даты и времени. Стандартный это набор функций и объектов POSIXct/POSIXlt .
• POSIXct - это численные векторы, каждая
компонента которых представляет число секунд
с начала 1970 года. Такие объекты подходят для
включения в блоки данных. Объекты POSIXlt –
это списки, в которых части даты/времени
хранятся как отдельные компоненты.
7. Конверсия из одной формы в другую
• Функция as.POSIXlt(obj) преобразует из POSIXct в POSIXlt.• Функция as.POSIXct(obj) преобразует из POSIXlt в POSIXct.
• Функция strptime(char,form) генерирует объекты POSIXlt
из подходящих строковых векторов, где формат должен
быть определен.
• Функция format(obj,form) генерирует символьные
векторы из объектов POSIXlt или POSIXct, также требуется
определение формата.
• Функция as.character(obj) aтакже генерирует символьные
строковые векторы как и format(,), но только в формате
даты/времени стандарта ISO standard time/date.
8. Примеры
• В какой день недели вы родились и сколько дней вы прожили?> myBday <- strptime("18-Apr-1973", "%d-%b-%Y")
> class(myBday)
[1] "POSIXt" "POSIXlt"
> myBday
[1] "1973-04-18"
> weekdays(myBday)
[1] “Wednesday”
>Sys.time()
[1] "2005-01-19 12:08:12 E. Australia Standard Time“
>Sys.time() – myBday
Time difference of 11599.51 days
9. Арифметические действия с объектами POSIXt
• Допускаются следующие арифметические действия с объектами дата/время (POSIXlt илиPOSIXct):
• obj + number
• obj - number
• obj1 <lop> obj2
• obj1 - obj2
В первых двух случаях number представляет собой число секунд. Если нужно добавить или
вычесть дни, работают с произведениями вида 60*60*24. В третьем случае <lop> это
логический оператор, а результат – логический вектор. В четвертом случае результат – это
объект difftime, представляющий собой разницу времен в секундах.
> as.numeric(Sys.time())
[1] 1106100492
> as.numeric(myBday)
[1] 0001837331070
>as.numeric(as.POSIXct(myBday))
[1] 103903200
>as.numeric(Sys.time()) - as.numeric(as.POSIXct(myBday))
[1] 100219729
10. Таблицы
Таблицы
Иногда удобно табулировать данные (представлять в виде таблиц частот). Это
можно сделать с помощью функции table в R. Набор данных quine состоит из
146 строк, описывающих этническую принадлежность (Eth), возраст (Age), пол
(Sex), количество пропусков в школе (Days) и их способность к учебе (Lrn). Eth,
Sex, Age и Lrn это категориальные переменные, Days – численный вектор. Если
мы хотим классифицировать объекты по возрасту, можно сделать следующее:
> attach(quine)
> table(Age)
> Age
Age
F0 F1 F2 F3
27 46 40 33
Если мы хотим узнать распределение по возрасту в соответствии с полом:
> table(Sex,Age)
Age
Sex F0 F1 F2 F3
F 10 32 19 19
M 17 14 21 14
11. Split
• Функция split делит данные, заданные вектором x, на группы, определенные фактором f. Эта функция может быть полезнойдля графического изображения данных.
• Если мы хотим получить описание разбиения Days по Sex, можно написать следующий код
> split(Days,Sex)
$F
[1] 3 5 11 24 45 5 6 6 9 13 23 25 32 53 54 5 5 11 17 19 8 13 14 20 47
[26] 48 60 81 2 0 2 3 5 10 14 21 36 40 25 10 11 20 33 5 7 0 1 5 5 5
[51] 5 7 11 15 5 14 6 6 7 28 0 5 14 2 2 3 8 10 12 1 1 9 22 3 3
[76] 5 15 18 22 37
$M
[1] 2 11 14 5 5 13 20 22 6 6 15 7 14 6 32 53 57 14 16 16 17 40 43 46 8
[26] 23 23 28 34 36 38 6 17 67 0 0 2 7 11 12 0 0 5 5 5 11 17 3 4 22
[51] 30 36 8 0 1 5 7 16 27 0 30 10 14 27 41 69
Или графически
> boxplot(split(Days,Sex),ylab="Days Absent")
> library(lattice) # trellis graphics
> trellis.par.set(col.whitebg())
> bwplot(Days ˜ Age | Sex) # implicit split
12. Графики
13. Функции with, subset and transform
• Эти функции производят операции над объектом или надэлементами внутри объекта. Не нужно подключение
(attachment) набора данных. These functions operate on
an object or elements within an object.
• with: выполняет выражения, содержащие данные
> with(Cars93,plot(Weight,100/MPG.highway))
• subset: возвращает подмножества векторов или блоков
данных, удовлетворяющих определенным требованиям
> Vans <- subset(Cars93,Type=="Van")
• transform: преобразует элементы объекта
> Cars93T <- transform(Cars93,WeightT=Weight/1000)
14. Векторизованные вычисления
• R позволяет выполнять вычисления над целымивекторами/матрицами/блоками данных/списками вместо их
отдельных элементов.
• Четыре функции: lapply, sapply, tapply, apply
• lapply: берет структуру, дает список результатов
• sapply: как lapply, но упрощает результат, если это возможно
• apply: используется только для массивов
• tapply: используется для неровных (ragged) массивов:
векторов, которые индексируются одним или несколькими
факторами.
Эти функции используются для эффективности и удобства.
15. Функция apply
• Эта функция позволяет оперировать последовательнымичастями массива. Для иллюстрации вычислим среднее
каждого столбца набора данных iris:
> iris[1:4,]
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1
2
3
4
5.1
3.5
1.4
0.2 setosa
4.9
3.0
1.4
0.2 setosa
4.7
3.2
1.3
0.2 setosa
4.6
3.1
1.5
0.2 setosa
> apply(iris[,-5],2,mean)
Sepal.Length Sepal.Width Petal.Length Petal.Width
5.843333 3.057333 3.758000 1.199333
16. Функция tapply
• Неровные массивы представляют собой комбинацию вектора и фактора меток групп, где размеры групп неправильные(irregular). Чтобы применять функции к неровным массивам, применяется tapply, в качестве аргументов которой
подставляются объект, список факторов и функция. Проиллюстрируем ее работу на наборе данных quine.
> quine[1:5,]
Eth Sex Age Lrn Days
1 A M F0 SL 2
2 A M F0 SL 11
3 A M F0 SL 14
4 A M F0 AL 5
5 A M F0 AL 5
• Чтобы вычислить среднее число пропусков для каждого возраста, можно использовать функцию tapply.
> tapply(Days,Age,mean)
F0
F1
F2
F3
14.85185 11.15217 21.05000 19.60606
Чтобы выполнить такие вычисления для классов Пол и Возраст, нужно использовать два фактора Sex и Age и функцию list
>tapply(Days,list(Sex,Age),mean)
F0
F1
F2
F3
F 18.70000 12.96875 18.42105 14.00000
M 12.58824 7.00000 23.42857 27.21429
17. Функции lapply и sapply
• lapply и sapply оперируют с компонентами списка или вектораlapply всегда возвращает список list
sapply более user-friendly чем lappy, пытается упрощать результат в
виде вектора или массива
# Example 1: lapply
> l <- list(Sex=Sex,Eth=Eth)
> lapply(l,table)
$Sex
F M
80 66
$Eth
A N
69 77
# Example 2: sapply
> l <- list(Sex=Sex,Eth=Eth)
> sapply(l,table)
Sex Eth
F 80 69
M 66 77
18. Импорт и экспорт данных
19. Чтение данных в R
• scan() - низкоуровневое средство чтения• read.table() - для чтения блоков данных из форматированных
текстовых файлов
• read.fwf() - для чтения файлов данных фиксированной ширины
• read.csv() - для чтения блоков данных из файлов с
разделенными запятыми переменными
• При чтении данных из файлов Excel самый простой метода –
сохранение каждого рабочего листа (worksheet ) отдельно в
виде csv-файла и использование функции read.csv() для
каждого из них
• Наилучший способ для прямой связи с файлом Excel – это
использование odbc
20. Низкоуровневая функция ввода scan()
Для чтения численныхданных
> vec <- scan()
1: 22 35 1.7 2.5e+01 77
6:
• Прочитано 5 элементов
• > vec
• [1] 22.0 35.0 1.7 25.0 77.0
• Два «ввода» обозначают
конец чтения данных
• Для чтения символов
> chr <- scan(what = "", sep = "\n")
1: This is the first string
2: This is the second
3: and another
4: that’s all we need for now
5:
• Прочитано 4 элемента
> chr
[1] "This is the first string"
[2] "This is the second"
[3] "and another"
[4] "that’s all we need for now"
21. scan() для чтения смешанных данных
> lis <- scan(what = list(flag = "", x = 0, y = 0))1: a 10 3.6
2: a 20 2.4
3: a 30 1.2
4: b 10 5.4
5: b 20 3.7
6: b 30 2.4
7:
• Прочитано 6 записей
> dat <- as.data.frame(lis)
> dat
flag x y
1 a 10 3.6
2 a 20 2.4
3 a 30 1.2
4 b 10 5.4
5 b 20 3.7
6 b 30 2.4
22. Импорт прямоугольных таблиц read.table()
• Эта функция позволяет определять аргументзаголовка, разделители, способ работы с
пропущенными значениями и незаполненными или
пустыми строками. Эта функция подходит для наборов
данных среднего размера, но не подходит для
больших численных матриц. Функции read.csv или
read.delim также могут использоваться для чтения
прямоугольных файлов с разделителями запятыми.
Более того, функция read.csv часто является лучшим
выбором для чтения разделенных запятыми
текстовых файлов, экспортированных из excel.
23. Пример
> samp1 <- read.csv("samp1.csv")> samp1[1:3,]
ID Name Prob
1 1 a 0.812
2 2 b 0.982
3 3 c 0.725
24. Импорт формата с фиксированной шириной read.fwf()
• Формат с фиксированной шириной необычендля большинства наборов данных. Обычно они
разделены табуляцией или запятыми. Для
данного типа формата наряду с разделителем
необходимо определить вектор ширины.
Функция read.fwfwrite записывает временных
файл, разделенный табуляцией, а затем
вызывает read.table. Эта функция полезна
только для маленьких файлов данных.
25. Пример
> dat.ff <- tempfile()> cat(file=dat.ff,"12345678","abcdefgh",sep="\n")
> read.fwf(dat.ff,width=c(2,4,1,1))
V1 V2 V3 V4
1 12 3456 7 8
2 ab cdef g h
> unlink(dat.ff) # clean up afterwards
26. Редактирование данных
• Функции edit и fix позволяют менять файлы данных. Этоудобно для маленьких наборов данных и для получения
моментального снимка данных на экране. Функция fix
позволяет делать изменения, и затем присваивает
измененную версию рабочему пространству.
> fix(samp1)
• Функция edit вызывает текстовый редактор для объекта,
результат изменений – это копия, которая может быть
записана в новый объект.
> samp1.new <- edit(samp1)
27. Импорт бинарных файлов
• Бинарные файлы, записанные в других статистическихпакетах, могут быть прочитаны в R. Пакет R foreign
обеспечивает средства импорта из бинарных файлов EpiInfo,
Minitab, S-Plus, SAS, SPSS, Stat and Systat.
• read.epiinfo() - чтение из текстовых файлов EpiInfo
• read.mtp() – импорт рабочих листов Minitab
• read.xport() – чтение файлов SAS в формате TRANSPORT
• read.S() – чтение бинарных объектов, созданных в S-PLUS
• read.spss() – чтение файлов из SPSS, созданных командами
save и export
• read.dta() читает бинарные файлы Stata
• read.systat() читает прямоугольные файлы, сохраненные в
Systat
28.
29. Чтение больших файлов данных
• Есть ограничения на типы файлов, которые R может считывать.Большие файлы с данными могут вызывать проблемы, т.к. R
хранит объекты и наборы данных в памяти. Поэтому во время
выполнения функции могут храниться несколько копий набора
данных. Объекты > 100Mb могут вызывать переполнение памяти.
СУБД лучше подходят для извлечения и обобщения данных. ODBC
позволяет получать доступ к данным из различных СУБД.
Существует несколько пакетов, обеспечивающих разный уровень
функциональности: копирование, отбор данных, запросы и
доставка. В основном эти пакеты работают с реляционными БД.
• RODBC это пакет для работы с Microsoft SQL Server, Access, MySQL
(Windows), Oracle, Excel, Dbase и текстовыми файлами. Возможно
создание нескольких одновременных соединений путем RODBC.
30. Пакет RODBC
• RODBC позволяет связаться с БД и доставитьинформацию. Важные функции RODBC включают
• Установку соединений с базами данных ODBC –
odbcConnect, odbcConnectAccess, odbcConnectDbase,
odbcConnectExcel
• Просмотр списка таблиц в базе данных ODBC – sqlTables
• Чтение таблицы из базы ODBC – sqlFetch
• Запросы к БД ODBC и доставка результатов – sqlQuery
• Библиотека RODBC позволяет выводить данные из
нескольких листов Excel, но названия листов не должны
содержать пробелов.
31. Вывод данных из R
• Функция cat является базовой для экспорта данных. Оназаписывает объекты в файлы или печатает на экране.
Функция sink также может использоваться для записи данных
в файл.
• Функция print печатает объекты и возвращает их.
• Функция write записывает вектор или матрицу в файл с
определенным числом столбцов.
• Для записи матриц или блоков данных рекомендуется
использовать функцию write.table, но для очень больших
матриц лучше использовать write.matrix (MASS library).
Функция write.matrix может записывать матрицы по частям
для сокращения объема памяти.
32. Функция cat
• Этой функцией очень удобно пользоватьсядля печати на экране
> cat("Hello World\n")
Hello World
• Также можно записать текст в файл
> cat("Hello World\n",file="output.txt“)
33. Функция sink
• Может использоваться для записи объектов и текстав файл.
> sink("output.txt")
> sample(1:100,100,replace=T)
> letters[1:10]
> sink()
34. Функция write.table
• Пример 1. Создание соединения передзаписью
> con <- file("myData.csv", "w+")
> write.table(myData, con, sep = ",")
> close(con)
• Пример 2. Запись данных напрямую
> write.table(myData, "myData.txt")
35. Вывод графики из R
• Есть 4 способа для экспорта графики из R.1. Функция postscript производит инкапсулированный postscript
файл, содержащий рисунок
– Это гибкая функция, позволяющая настраивать размер и ориентацию
рисунка
– Затем рисунок может быть встроен в документ LaTeX с помощью
команды includegraphics
> postscript("graph.ps",paper="a4")
> hist(rnorm(10000))
> dev.off()
null device
1
•. Другие похожие функции, доступные в R: windows, pdf, pictex,
png, jpeg, bmp and xfig
36. Вывод графики из R
2. Более простой, но менее гибкий способ –использование графического окна и
сохранение путем File -> Save As. Опции:
metafile, postscript, pdf, png, bitmap или jpeg
3. File -> Copy to the clipboard -> as Metafile.
Этот способ хорошо подходит для вставки в
Word, Excel и Powerpoint.
4. Прямая печать из R с помощью Print