Kodomo

Пользователь

Учебная страница курса биоинформатики,
год поступления 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

[gapminderDataFiveYear.txt]

Установка пакета

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.csv]

Хотим построить точечный график оценок для каждого студента, каждый предмет своим цветом

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/

Чистка данных

[rollingsales_brooklyn.xls]

Источники проблем в данных

Данные про жилье в Бруклине: 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")