Введение в R. Часть 3

А. М. Ярославцев

Введение в R. Ч3.

Циклы с подсчетом повторов - for

for (i in от:до) { действия}

y=c()
for (i in 1:10)
{
  x=i+2
  y=c(y,x)
}
y
##  [1]  3  4  5  6  7  8  9 10 11 12
l = list(1:10,-2:10,-9:-3,400:1000, 120:190)
mn=c()
for (i in 1:length(l))
  {
    mn=c(mn,mean(l[[i]]))
  }
mn
## [1]   5.5   4.0  -6.0 700.0 155.0

Пример 1 - Вычисление числа пи методом Монте-Карло

Попробуйте запустить алгоритм для разных а, например, 3, 10, 100, 100000

a=100000
x=runif(a,-1,1) 
y=runif(a,-1,1) 
Pi=0 ; Nr=0 ; Ns=0

for (i in 1:a)
{
if ((x[i]^2+y[i]^2)>1)
  { 
    Ns=Ns+1
     }
  else
  {
    Nr=Nr+1
     }
}
Pi=4*Nr/(Ns+Nr); Pi
## [1] 3.13804

Визуализация алгоритма вычисления числа пи

Нарисуйте графики для 100, 1000, 3000 и 10000 итераций

pis=c()
for (i in seq(10,3000,10))
    { x=runif(i,-1,1)
      y=runif(i,-1,1)
      z=table(x^2+y^2<=1)
      my_p=4*z[2]/i
      pis=c(pis,my_p)
    }
mean(pis)
## [1] 3.147457
plot(pis,type="l")

hist(pis,nclas=100)

Пример 2 - создание списка, содержащего матрицу

iris[1:6,]
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
l=list()
for (i in 1:length(iris[,1]))
  {
   v=c(iris[i,1],sum(iris[,1])-iris[i,1],iris[i,2],sum(iris[,2])-iris[i,2])
  # print(v)
   dim(v)=c(2,2)
  # print(v)
   l2=list(v)
   l=c(l,l2)
   }
l[1:3]
## [[1]]
##       [,1]  [,2]
## [1,]   5.1   3.5
## [2,] 871.4 455.1
## 
## [[2]]
##       [,1]  [,2]
## [1,]   4.9   3.0
## [2,] 871.6 455.6
## 
## [[3]]
##       [,1]  [,2]
## [1,]   4.7   3.2
## [2,] 871.8 455.4

Функции группы Apply

Функции группы apply() позволяют применить какую-либо функцию к массивам большой размерности:

apply(iris[,1:4],2,sum)
## Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
##        876.5        458.6        563.7        179.9
tapply(iris$Sepal.Length, iris$Species, sum)
##     setosa versicolor  virginica 
##      250.3      296.8      329.4

Базовая графика - функция plot(x,y)

plot(5:10)

x=c(2,4, 6, 8, 11,12,15)
y=c(3, 5, 6, 5,4, 6, 4)
plot(x,y)

plot(x,y, type="l")

plot(x,y, type="b")

plot(x,y,type="h")

plot(x,y,type="s", col=rgb(.90,.10,.10,.9))

 # подписи и заголовок
 plot(x,y,main="Title",xlab="X",ylab="Y")

 # графики с разным размером, цветом и формой символов
# plot(x,y,pch=16,col="red")
# plot(x,y,pch=8,cex =3, col="black")
 plot(x,y,pch=16,cex =10, col="blue")

# plot(x,y,pch=19,cex =5, col="green")
#графики с разными границами на осях  
#plot(x,y,col="red",xlim=c(2,5),ylim=c(0,10))
 plot(x,y,col="red",xlim=c(-3,20),ylim=c(0,20))

 #графики с разными линиями 
# plot(x, y,  type= "l", lty=5,lwd=5,  col ="blue") 
 plot(x, y,  type= "l", lty=9,lwd=7,  col ="green") 

 #посмотреть текущие настройки 
 par()
## $xlog
## [1] FALSE
## 
## $ylog
## [1] FALSE
## 
## $adj
## [1] 0.5
## 
## $ann
## [1] TRUE
## 
## $ask
## [1] FALSE
## 
## $bg
## [1] "white"
## 
## $bty
## [1] "o"
## 
## $cex
## [1] 1
## 
## $cex.axis
## [1] 1
## 
## $cex.lab
## [1] 1
## 
## $cex.main
## [1] 1.2
## 
## $cex.sub
## [1] 1
## 
## $cin
## [1] 0.15 0.20
## 
## $col
## [1] "black"
## 
## $col.axis
## [1] "black"
## 
## $col.lab
## [1] "black"
## 
## $col.main
## [1] "black"
## 
## $col.sub
## [1] "black"
## 
## $cra
## [1] 28.8 38.4
## 
## $crt
## [1] 0
## 
## $csi
## [1] 0.2
## 
## $cxy
## [1] 0.02218935 0.06544861
## 
## $din
## [1] 7.999999 4.895833
## 
## $err
## [1] 0
## 
## $family
## [1] ""
## 
## $fg
## [1] "black"
## 
## $fig
## [1] 0 1 0 1
## 
## $fin
## [1] 7.999999 4.895833
## 
## $font
## [1] 1
## 
## $font.axis
## [1] 1
## 
## $font.lab
## [1] 1
## 
## $font.main
## [1] 2
## 
## $font.sub
## [1] 1
## 
## $lab
## [1] 5 5 7
## 
## $las
## [1] 0
## 
## $lend
## [1] "round"
## 
## $lheight
## [1] 1
## 
## $ljoin
## [1] "round"
## 
## $lmitre
## [1] 10
## 
## $lty
## [1] "solid"
## 
## $lwd
## [1] 1
## 
## $mai
## [1] 1.02 0.82 0.82 0.42
## 
## $mar
## [1] 5.1 4.1 4.1 2.1
## 
## $mex
## [1] 1
## 
## $mfcol
## [1] 1 1
## 
## $mfg
## [1] 1 1 1 1
## 
## $mfrow
## [1] 1 1
## 
## $mgp
## [1] 3 1 0
## 
## $mkh
## [1] 0.001
## 
## $new
## [1] FALSE
## 
## $oma
## [1] 0 0 0 0
## 
## $omd
## [1] 0 1 0 1
## 
## $omi
## [1] 0 0 0 0
## 
## $page
## [1] TRUE
## 
## $pch
## [1] 1
## 
## $pin
## [1] 6.759999 3.055833
## 
## $plt
## [1] 0.1025000 0.9475000 0.2083404 0.8325106
## 
## $ps
## [1] 12
## 
## $pty
## [1] "m"
## 
## $smo
## [1] 1
## 
## $srt
## [1] 0
## 
## $tck
## [1] NA
## 
## $tcl
## [1] -0.5
## 
## $usr
## [1] 0 1 0 1
## 
## $xaxp
## [1] 0 1 5
## 
## $xaxs
## [1] "r"
## 
## $xaxt
## [1] "s"
## 
## $xpd
## [1] FALSE
## 
## $yaxp
## [1] 0 1 5
## 
## $yaxs
## [1] "r"
## 
## $yaxt
## [1] "s"
## 
## $ylbias
## [1] 0.2
 #сделать подписи к осям красными
 par(col.lab="red") # par(col.lab="brown")
 hist(mtcars$mpg, col="green")  #нарисовать график с новыми настройками

 #размер текста и символов
 plot(mtcars$mpg~mtcars$wt,main="Normal title")

 #увеличение заголовка
 plot(mtcars$mpg~mtcars$wt,main="Huge title",cex.main=3)

 #увеличение текста по осям
 plot(mtcars$mpg~mtcars$wt,main="title",cex.axis=3)

 #увеличение подписей по осям
 plot(mtcars$mpg~mtcars$wt,main="title",cex.lab=1.8)

 #построение матрицы диаграмм рассеивания 
 pairs(mtcars[,c(1,3,5,6)],main="Simple Scatterplot Matrix")

 #круговая диаграмма 
 Texture=c(3,15,62,8,6,6)
 names(Texture)=c("средний песок","мелкий песок","крупная пыль","средняя пыль","мелкая пыль","ил")
 pie(Texture, cex = 0.6, radius = 0.9, init.angle = -10, 
  main = "Гран. состав гор. A1 агросерой почвы", col = c(2:8))

 #комбинация графиков
 par(mfrow=c(2,2));  plot(mtcars$wt,mtcars$mpg) 
 plot(mtcars$wt,mtcars$disp);  hist(mtcars$wt); boxplot(mtcars$wt)

 # снятие комбинации графиков
 par(mfrow=c(1,1))
plot(seq(-10,10,.01),sin(seq(-10,10,.01)), type="h")

plot(seq(-10,10,.01), sin(seq(-10,10,.01)), col=rgb(.90,.10,.10,.9), type="h", xlim=c(-20,20), ylim=c(-5,5))

plot(seq(-10,10,.01),sin(seq(-10,10,.01)), col=rgb(.90,.10,.10,.9), type="h", xlim=c(-20,20), ylim=c(-5,5),main="My first cos(x)",xlab="x",ylab="sin(x)")

plot(seq(-10,10,.01),sin(seq(-10,10,.01)), col=rgb(.90,.10,.10,.9), type="l", xlim=c(-20,20), ylim=c(-5,5),main="My first cos(x)",xlab="x",ylab="sin(x)",lwd=.4)

plot(seq(-10,10,.01),sin(seq(-10,10,.01)), col=rgb(.90,.10,.10,.9), type="l", xlim=c(-20,20), ylim=c(-5,5),main="My first cos(x)",xlab="x",ylab="sin(x)",lwd=4, lty=4)

plot(seq(-10,10,.01),sin(seq(-10,10,.01)), col=rgb(.90,.10,.10,.9), type="b", xlim=c(-20,20), ylim=c(-5,5),main="My first cos(x)",xlab="x",ylab="sin(x)",lwd=4, lty=4, pch=4)

####Добавление линий на график
plot(seq(-10,10,.01),sin(seq(-10,10,.01)), type="l")
lines(seq(-10,10,.01),rep(c(0),2001), type="l", col="red")

x=(seq(-10,10,.01))
plot(x, (1-x^2)^.5, type="l",ylim=c(1,-1), xlim=c(-1,1))
lines(x, -((1-x^2)^.5)); lines(rep(c(0),401),seq(-2,2,.01))
lines(seq(-2,2,.01),rep(c(0),401))

Пакет ggplot2

#install.packages("ggplot2")
library(ggplot2)

Cодержимое данных mtcars посмотрим с помощью функции str()

str(mtcars)
## 'data.frame':    32 obs. of  11 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...
##  $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
##  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
##  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
##  $ qsec: num  16.5 17 18.6 19.4 17 ...
##  $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
##  $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
##  $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
##  $ carb: num  4 4 1 1 2 1 4 2 2 4 ...
ggplot(mtcars, aes(x = cyl, y = mpg)) +
  geom_point()

# Построим график рассматривая cyl как фактор
ggplot(mtcars, aes(x = factor(cyl), y = mpg)) +
  geom_point()

#Точечная диаграмма
ggplot(mtcars, aes(x = wt, y = mpg)) +   geom_point()

# ggplot умеет автоматически создавать легенды для категориальных переменных, например когда вы задаете ее цветом точек.
ggplot(mtcars, aes(x = wt, y = mpg, col = disp)) +
  geom_point()

#Точкам можно задавать размер
ggplot(mtcars, aes(x = wt, y = mpg, size = disp)) +
  geom_point()

# Добавим geom\_point() и geom\_smooth() через символ +
ggplot(diamonds, aes(x = carat, y = price)) + geom_point() + geom_smooth()
## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'

# Построим график
ggplot(diamonds, aes(x = carat, y = price)) +
  geom_point() +  geom_smooth()
## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'

# Покажем только сглаженную линию
ggplot(diamonds, aes(x = carat, y = price)) +  geom_smooth()
## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'

# Зададим правильное значение  col из aes()
ggplot(diamonds, aes(x = carat, y = price, col=clarity)) +
  geom_smooth()
## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'

# Сохранием настройки из предыдущей команды. Нарисуем только точки с указанным значением alpha.
ggplot(diamonds, aes(x = carat, y = price, col=clarity)) +
  geom_point(alpha = 0.4)

# Создадим объекты, содержащие данные и слои aes: dia_plot
dia_plot = ggplot(diamonds, aes(x = carat, y = price))

# Добавим слой  geom с точками geom_point()

dia_plot + geom_point()

#Добавим тот же  geom layer, но со значениеями aes() внутри

dia_plot + geom_point(aes(col=clarity))