Учебная страница курса биоинформатики,
год поступления 2015
Преобразование данных
reshape2
Установка пакета
install.packages("reshape2") library(reshape2)
Тестовые данные
a=data.frame(name=c('John', 'Mary', 'Peter', 'Susan'), sex=c('m','f','m','f'), age=c(26,21,19,29), weight=c(82, 56, 79, 60), height=c(182, 171, 179, 175))
Расплавление данных
a_melt=melt(a, id.vars = c('name','sex'), variable.name = c('a_variable'), value.name = 'a_name')
Формирование данных
dcast(a_melt,name ~ a_variable) dcast(a_melt,name + sex ~ a_variable)
Визуализация данных
ggplot2
Установка пакета
install.packages("ggplot2") library("ggplot2")
p <- ggplot(gapminder, aes(x = gdpPercap, y = lifeExp)) p + geom_point() ggplot(gapminder, aes(x = log10(gdpPercap), y = lifeExp)) + geom_point() p + geom_point() + scale_x_log10() p + geom_point() + scale_x_log10() + geom_smooth() p + geom_point() + scale_x_log10() + geom_smooth(lwd = 3, se = FALSE, method = "lm") ggplot(subset(gapminder, country == "Zimbabwe"), aes(x = year, y = lifeExp)) + geom_line() + geom_point() jCountries <- c("Canada", "Rwanda", "Cambodia", "Mexico") ggplot(subset(gapminder, country %in% jCountries), aes(x = year, y = lifeExp, color = country)) + geom_line() + geom_point() ggplot(gapminder, aes(x = continent, y = lifeExp)) + geom_point() ggplot(gapminder, aes(x = continent, y = lifeExp)) + geom_jitter() ggplot(gapminder, aes(x = continent, y = lifeExp)) + geom_boxplot() ggplot(gapminder, aes(x = continent, y = lifeExp)) + geom_boxplot(outlier.colour = "hotpink") + geom_jitter(position = position_jitter(width = 0.1, height = 0), alpha = 1/4) ggplot(gapminder, aes(x = lifeExp)) + geom_histogram() ggplot(gapminder, aes(x = lifeExp)) + geom_density() ggplot(gapminder, aes(x = lifeExp, color = continent)) + geom_density() ggplot(gapminder, aes(x = lifeExp, fill = continent)) + geom_density(alpha = 0.2) ggplot(subset(gapminder, continent != "Oceania"), aes(x = lifeExp, fill = continent)) + geom_histogram() + facet_grid(continent ~ .) p + ggtitle("Life expectancy over time by continent") p + theme_bw()
Пример с melt
Хотим построить точечный график оценок для каждого студента, каждый предмет своим цветом
grades<-read.csv("grades.csv") grades_m<-melt(grades, id.vars = c("id", "X")) p1<-ggplot(grades_m, aes(x = id, y = value, color=variable)) + geom_point()
Больше графиков тут:
http://www.r-graph-gallery.com/portfolio/ggplot2-package/
Чистка данных
Источники проблем в данных
- Особенности формата (лишние строки в начале файла, наличие/отсутствие заголовка, нетрадиционные разделители, …)
- Отсутствие некоторых данных (na)
- Типы данных (перевод строк в числа и т.п.)
- Выбросы, которые искажают общий тренд
Данные про жилье в Бруклине: rollingsales_brooklyn.xls Для начала попробуйте открыть файл в Excel и посмотреть, как он выглядит.
Устанавливаем и подключаем пакет gdata:
install.packages("gdata") require(gdata)
Читаем данные:
bk <- read.xls("rollingsales_brooklyn.xls",pattern="BOROUGH") #все что до строки, содержащей , "BOROUGH", не читаем
Смотрим на данные:
head(bk) summary(bk) #сводная статистика, чего сколько
Чистим данные
Смотрим колонку с ценами:
head(bk$SALE.PRICE)
[1] $403,572 $218,010 $952,311 $842,692 $815,288 $815,288 3318 Levels: $0 $1 $10 $100 $1,000 $10,000 $100,000 $1,000,000 ... $999,999
Переводим цены в числовой формат:
bk$SALE.PRICE.N <- as.numeric(gsub("[^[:digit:]]","", bk$SALE.PRICE))# убираем все кроме цифр, т.е. заменяем все кроме цифр на “”
В данных часто бывает, что какие-то данные отсутствуют. В этом случае там стоит специальное значение NA. Это часто мешает производить вычисления.
x<-c(1,2,3,NA,3,4) mean(x)
Но можно указать, что значения NA нужно убрать прежде чем производить вычисления
mean(x, na.rm=TRUE)
Или убрать предварительно NA из выборки
mean(na.omit(x))
На самом деле "na.omit" возвращает специальный объект
x<-na.omit(x) print(x)
Но его всегда можно снова превратить в вектор
x<-as.vector(x) print(x)
Смотрим, для скольки объектов у нас нет данных про цены
count(is.na(bk$SALE.PRICE.N))# можно вместо count сделать sum
Сделаем все имена столбцов маленькими буквами
names(bk) <- tolower(names(bk))
Приведем в порядок площади
head(bk$gross.square.feet) bk$gross.sqft <- as.numeric(gsub("[^[:digit:]]","", bk$gross.square.feet)) head(bk$land.square.feet) bk$land.sqft <- as.numeric(gsub("[^[:digit:]]","", bk$land.square.feet))
Приведем в порядок даты
bk$sale.date <- as.Date(bk$sale.date) bk$year.built <- as.numeric(as.character(bk$year.built))
Надоело писать длинные имена? Работаем с одной таблицей? Нет проблем!
attach(bk)#теперь по-умолчанию работаем только с bk hist(sale.price.n)#обращаемся прямо по имени поля hist(sale.price.n[sale.price.n>0]) hist(gross.sqft[sale.price.n==0]) detach(bk)#закончили работать, открепляемся!
Теперь беглый анализ, как устроены данные
bk.sale <- filter(bk, bk$sale.price!=0 & bk$gross.sqft!=0) plot(bk.sale$gross.sqft,bk.sale$sale.price.n)
“Вынем” данные из нуля
plot(log(bk.sale$gross.sqft),log(bk.sale$sale.price.n))
Выберем для анализа только дома (категория содержит в названии “FAMILY”)
library(data.table) bk.houses <- bk.sale %>% filter(building.class.category %like% "FAMILY") plot(log(bk.houses$gross.sqft),log(bk.houses$sale.price.n))
Уберем “особенные” дома
bk.houses <- bk.houses %>% filter(log(sale.price.n) > 5) plot(log(bk.houses$gross.sqft),log(bk.houses$sale.price.n))
Добавим линию регрессии
abline(lm(log(bk.houses$sale.price.n)~log(bk.houses$gross.sqft)), col="red")