Атомарные типы данных в R

Рассмотрим простые операции в R

x<-5
x
## [1] 5
x+1
## [1] 6
str(x)
##  num 5
summary(x)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       5       5       5       5       5       5
y<-"Какой-то текст"
str(y)
##  chr "Какой-то текст"
summary(y)
##    Length     Class      Mode 
##         1 character character

Ничего сложного, но и интересного мы тоже не видим.

Предположим, что у нас есть рост студентов.Опишем два вектора, в одном пусть у нас будет рост, в другом,соответственно, пол.

x<-c(187,150,150,171,172,185,161,180,178)
y<-c("м","ж","ж","ж","ж","м","ж","м","м")
summary(x)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   150.0   161.0   172.0   170.4   180.0   187.0
summary(y)
##    Length     Class      Mode 
##         9 character character
sort(x)
## [1] 150 150 161 171 172 178 180 185 187

Последняя команда сортирует вектор x. Справку о любой команде всегда можно получить набрав перед ней вопрос.

?sort

Работа с таблицами данных

Соберем два вектора в таблицу

MyTable<-data.frame(x,y)
MyTable
##     x y
## 1 187 м
## 2 150 ж
## 3 150 ж
## 4 171 ж
## 5 172 ж
## 6 185 м
## 7 161 ж
## 8 180 м
## 9 178 м
summary(MyTable)
##        x         y    
##  Min.   :150.0   ж:5  
##  1st Qu.:161.0   м:4  
##  Median :172.0        
##  Mean   :170.4        
##  3rd Qu.:180.0        
##  Max.   :187.0

К любому элементу таблицы можно обратиться по индексу

MyTable[1,1]
## [1] 187
MyTable[1,2]
## [1] м
## Levels: ж м
MyTable[1,]
##     x y
## 1 187 м
MyTable[,1]
## [1] 187 150 150 171 172 185 161 180 178
MyTable[,2]
## [1] м ж ж ж ж м ж м м
## Levels: ж м

Можно обратиться по имени колонки

MyTable$x
## [1] 187 150 150 171 172 185 161 180 178
MyTable$y[2]
## [1] ж
## Levels: ж м

Мы можем определить размеры любой таблицы

dim(MyTable)
## [1] 9 2
nrow(MyTable)
## [1] 9
ncol(MyTable)
## [1] 2

И сделать из неё выборку с помощью команды sample.

Как это делается? Созадим вектор, содержащий индексы элементов и присвоим случайную выборку вектору i. Обратите внимание, поскольку каждый раз у нас получается случайное число, то результаты могли бы быть различными, если вы запустили бы это файл у себя на компьютере. Чтобы это избежать командой set.seed я настроил генератор случайных чисел.

set.seed(2016)
k<-1:9
i<-sample(k,5)

Сделаем случайную выборку и выберем оставшиеся элементы

MyTable[i,]
##     x y
## 2 150 ж
## 9 178 м
## 6 185 м
## 1 187 м
## 3 150 ж
MyTable[-i,]
##     x y
## 4 171 ж
## 5 172 ж
## 7 161 ж
## 8 180 м
test<-MyTable[i,]
test2<-MyTable[-i,]
test
##     x y
## 2 150 ж
## 9 178 м
## 6 185 м
## 1 187 м
## 3 150 ж
test2
##     x y
## 4 171 ж
## 5 172 ж
## 7 161 ж
## 8 180 м

А что делать, если нам нужно выбрать конкретные значения из таблицы?

subset(MyTable,x>180)
##     x y
## 1 187 м
## 6 185 м
subset(MyTable,y=="ж")
##     x y
## 2 150 ж
## 3 150 ж
## 4 171 ж
## 5 172 ж
## 7 161 ж
subset(MyTable,y!="ж")
##     x y
## 1 187 м
## 6 185 м
## 8 180 м
## 9 178 м
subset(MyTable,y!="ж" & x>180)
##     x y
## 1 187 м
## 6 185 м

А можно то же самое записать иначе:

MyTable[MyTable$x>180,]
##     x y
## 1 187 м
## 6 185 м
MyTable[MyTable$y=="ж",]
##     x y
## 2 150 ж
## 3 150 ж
## 4 171 ж
## 5 172 ж
## 7 161 ж
MyTable[MyTable$y!="ж",]
##     x y
## 1 187 м
## 6 185 м
## 8 180 м
## 9 178 м
MyTable[x>180 & MyTable$y!="ж",]
##     x y
## 1 187 м
## 6 185 м

Генерация случайных чисел

Случайные числа нормально распределенные и равномерно распределеные генерируются весьма просто:

rnorm(10)
##  [1] -1.1687190  1.2294454 -1.6122037 -0.6039044  1.1580314 -0.2707606
##  [7] -1.1179372 -1.3473558  0.4832675  0.1523950
runif(10)
##  [1] 0.5990604 0.1825765 0.6122207 0.9446349 0.4286494 0.6307481 0.8211219
##  [8] 0.1902182 0.8786831 0.8510993

Построение графиков

plot(x,xlab="Измерение",ylab="Рост, см")

plot(x,xlab="Измерение",ylab="Рост, см",main="Рост студентов")

plot(x,xlab="Измерение",ylab="Рост, см",main="Рост студентов",pch=19)

plot(x,xlab="Измерение",ylab="Рост, см",main="Рост студентов",pch=19,col="red")

hist(x)

hist(x,xlab="Измерение",ylab="Рост, см",main="Рост студентов",pch=2,col="red",breaks=9)

boxplot(x~y,data=MyTable)

По идее, наш данные должны быть распределены нормально. Проверим это с помощью теста Шапиро-Уилка.

shapiro.test(x)
## 
##  Shapiro-Wilk normality test
## 
## data:  x
## W = 0.90311, p-value = 0.2706
# Альтернативный вариант для таблицы
shapiro.test(MyTable$x)
## 
##  Shapiro-Wilk normality test
## 
## data:  MyTable$x
## W = 0.90311, p-value = 0.2706

Проверим его на нормальном и логнормальном распределении, что бы понять, как меняется p-value.

shapiro.test(rnorm(10))
## 
##  Shapiro-Wilk normality test
## 
## data:  rnorm(10)
## W = 0.95559, p-value = 0.7346
shapiro.test(rnorm(100))
## 
##  Shapiro-Wilk normality test
## 
## data:  rnorm(100)
## W = 0.97693, p-value = 0.07642
shapiro.test(rlnorm(100))
## 
##  Shapiro-Wilk normality test
## 
## data:  rlnorm(100)
## W = 0.70394, p-value = 6.667e-13

Для графического теста используется график квантилей

qqnorm(x,pch=19)
qqline(x)

Сравним с графиками для нормального и логнормального распределения.

qqnorm(a<-rnorm(100),pch=19);qqline(a,col="red",lwd=3)

qqnorm(a<-rlnorm(100),pch=19);qqline(a,col="red",lwd=3)

Во втором случае, есл мы логарифмируем число, то должны получить нормальное распределение.

qqnorm(log(a))

И напоминаю, чтобы загрузить данные из Excel через clipboard нужно выполнить команду.

mt<-read.table("clipboard",header=T)