\documentclass[a4paper,11pt]{scrartcl} %\usepackage[warn]{mathtext} \usepackage[T2A]{fontenc} \usepackage[koi8-r]{inputenc} %\usepackage[utf8]{inputenc} \usepackage[english,russian]{babel} \usepackage{indentfirst}%first paragraph indent \usepackage{cmap} \usepackage[unicode=true]{hyperref} \usepackage{graphicx} \usepackage{amssymb} \usepackage{amsmath} \usepackage{srcltx} \usepackage{textcomp} \usepackage{floatflt} \usepackage{wrapfig} \usepackage{afterpage} \usepackage{ccaption} \captiondelim{. } \usepackage{xspace} %научные символы и смайлики \smiley \frownie \usepackage{wasysym} \usepackage[noae]{Sweave} \usepackage{underscore} %переопределение примечания для KOMA-script % [отступ до метки]{отступ}{отступ абзаца} \deffootnote[2.5em]{1.5em}{1em}{\textsuperscript{\thefootnotemark}} \setkomafont{sectioning}{\bfseries} \setkomafont{descriptionlabel}{\bfseries} %backslash \newcommand{\bs}{\symbol{'134}} %degree \newcommand{\grad}{\ensuremath{{}^{\circ}}\xspace} %R-акроним \newcommand{\R}{{\sffamily\bfseries R}\xspace} \title{Типы данных в \R \\ и принципы работы с ними} \author{\textcopyright{} А.Б.\,Шипунов\thanks{e-mail: dactylorhiza@gmail.com}, Е.М.\,Балдин\thanks{e-mail: E.M.Baldin@inp.nsk.su}} \begin{document} \maketitle %\tableofcontents \section{Числовые векторы} \label{sec:vectors} Простейший вектор (рост сотрудников): <>= x <- c(174, 162, 188, 192, 165, 168, 172) @ Структура вектора: <>= str(x) @ Проверка: <<А вектор ли это?>>: <>= is.vector(x) @ \section{Факторы} \label{sec:factors} Текстовый (character) вектор (пол сотрудников): <>= sex <- c("male", "female", "male", "male", "female", "male", "male") is.character(sex) is.vector(sex) str(sex) @ Содержимое текстового вектора: <>= sex sex[1] table(sex) @ Задаём фактор: <>= sex.f <- factor(sex) sex.f @ График: <>= plot(sex.f) @ Что такое фактор: <>= is.factor(sex.f) is.character(sex.f) str(sex.f) @ Доступ к данным: <>= sex.f[5:6] sex.f[6:7] sex.f[6:7, drop=TRUE] factor(as.character(sex.f[6:7])) @ Приведение к цифровому виду: <>= as.numeric(sex.f) @ Ещё один вектор (вес сотрудников): <>= w <- c(69, 68, 93, 87, 59, 82, 72) @ Построение графика: <>= plot(x, w, pch=as.numeric(sex.f), col=as.numeric(sex.f)) legend("topleft", pch=1:2, col=1:2, legend=levels(sex.f)) @ Ещё один текстовый вектор (размер маек сотрудников): <>= m <- c("L", "S", "XL", "XXL", "S", "M", "L") m.f <- factor(m) m.f @ Упорядочиваем текстовые данные: <>= m.o <- ordered(m.f, levels=c("S", "M", "L", "XL", "XXL")) m.o @ \section{Пропущенные данные} \label{sec:nodata} Вектор данных с пропущенными значениями (время на сон) : <>= h <- c(8, 10, NA, NA, 8, NA, 8) h @ Вычисление среднего если есть пропущенные данные: <>= mean(h) mean(h, na.rm=TRUE) mean(na.omit(h)) @ Замена пропущенных данных на среднее по выборке: <>= h[is.na(h)] <- mean(h, na.rm=TRUE) h @ \section{Матрицы} \label{sec:matrix} Матрицы \(2\times2\): <>= m <- 1:4 m ma <- matrix(m, ncol=2, byrow=TRUE) ma str(ma) str(m) mb <- m mb attr(mb, "dim") <- c(2,2) mb @ Матрица \(2\times2\times2\): <>= m3 <- 1:8 dim(m3) <- c(2,2,2) m3 @ \section{Списки} \label{sec:lists} Обычный список: <>= l <- list("R", 1:3, TRUE, NA, list("r", 4)) l @ Способы доступа к данным: <>= h[3] ma[2, 1] l[1] str(l[1]) l[[1]] str(l[[1]]) @ Именование списка: <>= names(l) <- c("first", "second", "third", "fourth", "fifth") str(l$first) @ Именование векторов и матриц: <>= names(w) <- c("Коля", "Женя", "Петя", "Саша", "Катя", "Вася", "Жора") w w["Женя"] rownames(ma) <- c("a1","a2") colnames(ma) <- c("b1","b2") ma @ \section{Таблицы данных} \label{sec:tables} Пример таблицы данных: <>= d <- data.frame(weight=w, height=x, size=m.o, sex=sex.f) d str(d) @ Доступ к данным таблицы: <>= d$weight d[[1]] d[,1] d[,"weight"] @ Выбор нужных колонок: <>= d[,2:4] d[,-1] @ Выборка данных по условию: <>= d$sex=="female" d[d$sex=="female",] @ Сортировка выборки: <>= d[order(d$sex, d$height), ] @ \section{Векторизованные вычисления} \label{sec:vectorcount} Простые операции над векторами: <>= w*1000 @ Циклы: <>= for (i in seq_along(w)) { w[i] <- w[i] * 1000 } w @ Операции с матрицами: <>= ma + mb 1:8 + 1:2 @ Векторные операции: <>= apply(trees, 2, mean) sapply(d, as.numeric) by(d[,1:2], d$sex, mean) lapply(d, is.factor) @ \end{document}