Рассмотрим простые операции в 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)