Introducción a R · Contenidos 1 Introducci on 2 R Markdown 3 Vectores 4 Factores 5 Listas y...

Preview:

Citation preview

Introduccion a R

Dpto. Ciencias de la Computacion e Inteligencia ArtificialUniversidad de Sevilla

Contenidos

1 Introduccion

2 R Markdown

3 Vectores

4 Factores

5 Listas y marcos de datos

6 Graficos en RGraficos univariantesGraficos multivariantesAnadir otros elementos

7 Programacion en R

1 Introduccion

2 R Markdown

3 Vectores

4 Factores

5 Listas y marcos de datos

6 Graficos en RGraficos univariantesGraficos multivariantesAnadir otros elementos

7 Programacion en R

Introduccion

Instalacion

• El proyecto R (Windows, Mac-OS, Linux,. . . )

• Licencia GPL

• R-Studio Un entorno de desarrollo

Descripcion

• Lenguaje para el analisis de dato y la modelizacion.

• Analisis grafico y estadıstico

• Lenguaje de programacion orientado a objetos

• Ampliable a traves de numerosas bibliotecas disponibles

Bibliografıa

• Zuur, Alain; Ieno, Elena N.; Meesters, Erik “A Beginner’sGuide to R” (Springer, 2009)

• Manuales basicos que acompanan a R

• Documentacion en espanol

• Recomendados:• An Introduction to R• The R Guide

Guiones/Script

• Conjunto de instrucciones que el interprete debe calcularsucesivamente.

• Las expresiones se escriben en ficheros de texto (con extension.R) y se envıan a la consola de R

R-Studio

Espacio de trabajo

Espacio de trabajo (workspace)

• Conjunto de objetos definidos durante una sesion de trabajocon R que no se han borrado expresamente.• Fichero con extension .RData• Se carga con la instruccion load

Directorio de trabajo

Directorio de trabajo (Working Directory)Lugar de referencia que utiliza R para localizar los ficheros que leey escribe

• getwd()

• setwd(’directorio’)

Extensiones

Es posible extender R a traves de paquetes/bibliotecas.

• lattice: Biblioteca de graficoslibrary(lattice)

• ade4: Analisis de datos ecologicos

• class: Funciones de clasificacion

• seqinr: Analisis de secuencias• Existen multiples repositorios

• Bioconductor: http://www.bioconductor.org

install.packages("bioconductor",repos="www.bioconductor.org")

Extensiones

Ayuda

> ?mean

> help(mean)

> ??regresion

> help.search(’regression’)

• Description: Breve descripcion.

• Usage: Nombre de los argumentos y sus valores por defecto.

• Arguments: Descripcion detallada de cada argumento.

• Details: Descripcion detallada del comportamiento.

• Value: Descripcion detallada del valor devuelto por la funcion.

• See Also: Otras ayudas relacionadas.

• Examples: Ejemplos de uso.

Ayuda

Primeras nociones

• R distingue entre mayusculas y minusculas

> a <- 3

> A <- 5

> a

[1] 3

> A

[1] 5

• Identificadores validos: Cualquier combinacion de sımbolosalfanumericos junto con el punto y . No puede empezar conun dıgito.

• No renombrar los objetos (pi,. . . ) y/o funciones (c, t,. . . )de R.

Expresiones/Asignaciones

• Hay dos tipos de comandos: expresiones y asignaciones• Expresion. El resultado se muestra por pantalla y no se guarda.

> rnorm(5)

[1] 0.71690438 0.07539554 0.73687196 -0.43048351 -0.31119274

• Asignacion: no se muestra nada y se guarda

> v <- rnorm(4)

> v

[1] 0.46212728 -0.87838057 0.83872171 0.01630945

1 Introduccion

2 R Markdown

3 Vectores

4 Factores

5 Listas y marcos de datos

6 Graficos en RGraficos univariantesGraficos multivariantesAnadir otros elementos

7 Programacion en R

Markdown

• Creacion de documentos con formato

• Nacio para construir paginas html a partir de documentos detexto plano (sin formato).

Evolucion

Rapidamente extendido/adaptado/modificado para multiplesaplicaciones

Blogs https://en.support.wordpress.com/

markdown-quick-reference/

Whatsapp

R Markdown

• Creacion de documentos y presentaciones con codigo R

• Multiples formatos: HTML, MS Word, PDF (hay que tenerTeX instalado)

• http://rmarkdown.rstudio.com/

• install.packages("rmarkdown")

1 Introduccion

2 R Markdown

3 Vectores

4 Factores

5 Listas y marcos de datos

6 Graficos en RGraficos univariantesGraficos multivariantesAnadir otros elementos

7 Programacion en R

Vectores

• La estructura de datos mas simple.

• Coleccion ordenada de datos (todos del mismo tipo). Coercion

> x <- c(1, 2.5, c(4.2, 9, 7), FALSE) ; x

[1] 1.0 2.5 4.2 9.0 7.0 0.0

> x[1] <- 9 ; x

[1] 9.0 2.5 4.2 9.0 7.0 0.0

• Operaciones vectorizadas (se aplican a cada elemento)

• El mas corto se recicla (hasta la longitud del mas largo).

> y <- c(x,0,x) ; length(y)

[1] 13

> v <- 2*x + y + 1

Mensajes de aviso perdidos

In 2 * x + y :

longitud de objeto mayor no es multiplo de longitud de menor

> v

[1] 28.0 8.5 13.6 28.0 22.0 1.0 19.0 15.0 11.9 23.2 24.0 8.0 19.0

Vectores

• La estructura de datos mas simple.

• Coleccion ordenada de datos (todos del mismo tipo). Coercion

> x <- c(1, 2.5, c(4.2, 9, 7), FALSE) ; x

[1] 1.0 2.5 4.2 9.0 7.0 0.0

> x[1] <- 9 ; x

[1] 9.0 2.5 4.2 9.0 7.0 0.0

• Operaciones vectorizadas (se aplican a cada elemento)

• El mas corto se recicla (hasta la longitud del mas largo).

> y <- c(x,0,x) ; length(y)

[1] 13

> v <- 2*x + y + 1

Mensajes de aviso perdidos

In 2 * x + y :

longitud de objeto mayor no es multiplo de longitud de menor

> v

[1] 28.0 8.5 13.6 28.0 22.0 1.0 19.0 15.0 11.9 23.2 24.0 8.0 19.0

Generacion de secuencias

• El operador : (tiene la maxima precedencia)

> c(10:15,5:-5)

[1] 10 11 12 13 14 15 5 4 3 2 1 0 -1 -2 -3 -4 -5

• La funcion seq

> seq(1, 15,by=3) ; seq(15,1,length.out=5)

[1] 1 4 7 10 13

[1] 15.0 11.5 8.0 4.5 1.0

• La funcion rep

> rep(c(1,2,3), times=3)

[1] 1 2 3 1 2 3 1 2 3

> rep(c(1,2,3), each=3)

[1] 1 1 1 2 2 2 3 3 3

> rep(c(1,2,3), times=c(3,2,1))

[1] 1 1 1 2 2 3

Operaciones elementales

• +, -, *, /, , %%, %/%, sum, prod, cumsum, cumprod

• sin, cos, tan, asin, acos, atan, abs, sqrt, diff

• log, exp, max, min, pmax, pmin, cummax, cummin

• rev, range, length, sort, order

• summary, mean, median, var, sd, quantile, IQR

• round, ceiling, floor, trunc, signif

> x

[1] 1.0 2.5 4.2 9.0 7.0 0.0

> max(x)

[1] 9

> sort(x)

[1] 0.0 1.0 2.5 4.2 7.0 9.0

> order(x) ; x[order(x)]

[1] 6 1 2 3 5 4

[1] 0.0 1.0 2.5 4.2 7.0 9.0

Inf, NA, NaN

> sqrt(-1)

[1] NaN

> sqrt(-1+0i)

[1] 0+1i

> pi

[1] 3.141593

> 7 / 0

[1] Inf

> (- 6) / 0

[1] -Inf

> 0 / 0

[1] NaN

> Inf - Inf ; 2 * Inf + 5

[1] NaN

[1] Inf

> x ; x[c(3,13,5,15)]

[1] 1.0 2.5 4.2 9.0 7.0 0.0

[1] 4.2 NA 7.0 NA

Operaciones de conjuntos

• union, intersect, setdiff, setequal, is.element,

%in%, match

> conj1 <- unique(c(1,2,3,4,3,2,3,1,4)) ; conj1

[1] 1 2 3 4

> conj2 <- c(3,4,5)

> conj3 <- c(2,4,3,1)

> intersect(conj1,conj2)

[1] 3 4

> setequal(conj1,conj3)

[1] TRUE

> is.element(2,conj1)

[1] TRUE

> c(2,6,4,8) %in% conj1

[1] TRUE FALSE TRUE FALSE

> match(c(2,1),conj3)

[1] 1 4

Cadenas de caracteres

• Delimitadas por ", ’

• \\, \", \n, \t> paste(c("X","Y"), 1:10, sep="")

[1] "X1" "Y2" "X3" "Y4" "X5" "Y6" "X7" "Y8" "X9" "Y10"

> strsplit(c("acgtca","acgtaccgtacgact"), split="")

[[1]]

[1] "a" "c" "g" "t" "c" "a"

[[2]]

[1] "a" "c" "g" "t" "a" "c" "c" "g" "t" "a" "c" "g" "a" "c" "t"

> strsplit(c("acgtca","acatgaccgtatgact"), split="atg")

[[1]]

[1] "acgtca"

[[2]]

[1] "ac" "accgt" "act"

Valores logicos

• Comparacion: ==, !=, <, <=, >, >=

• Operadores: &, &&, |, ||, xor, !

> x <- 11:20

> !(x > 15)

[1] TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE

> x < 13 | x >= 17

[1] TRUE TRUE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE

> ((-2:2) >= 0) & ((-2:2) <= 0)

[1] FALSE FALSE TRUE FALSE FALSE

> ((-2:2) >= 0) && ((-2:2) <= 0)

[1] FALSE

> ((1:10) < 5) | ((1:10) > 8)

[1] TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE TRUE TRUE

> ((1:10) < 5) || ((1:10) > 8)

[1] TRUE

Seleccion/Modificacion de datos

• Vector de posiciones

> x

[1] 11 12 13 14 15 16 17 18 19 20

> x[c(1,2,3,2,21)]

[1] 11 12 13 12 NA

> x[11] <- 21 ; x

[1] 11 12 13 14 15 16 17 18 19 20 21

> x[c(1,2,3)] <- 3:1 ; x

[1] 3 2 1 14 15 16 17 18 19 20 21

> x[1:3] <- c(5,6)

Mensajes de aviso perdidos

In x[1:3] <- c(5, 6) :

numero de items para para sustituir no es un multiplo de ...

> x

[1] 5 6 5 14 15 16 17 18 19 20 21

> x <- c(11,12,13,x[4:10]) ; x

[1] 11 12 13 14 15 16 17 18 19 20

Seleccion de datos

• Vector de exclusiones> x[-c(1,7,5)]

[1] 12 13 14 16 18 19 20

• Vector de valores logicos

> y <- 1:10; x[y > 5]

[1] 16 17 18 19 20

> x[c(TRUE,FALSE,FALSE)]

[1] 11 14 17 20

• Vector de nombres> names(x) <- letters[1:10] ; x

a b c d e f g h i j

11 12 13 14 15 16 17 18 19 20

> x[c(’b’,’f’,’c’)]

b f c

12 16 13

Algunos ejemplos

> x <- c(2, 3, 5, 7, 11, 13)

> which.max(x)

[1] 6

> which(x > 5)

[1] 4 5 6

> length(x > 5)

[1] 6

> length(which(x > 5))

[1] 3

> sum(x > 5)

[1] 3

> sum(x[x > 5])

[1] 31

> x < 3 | x > 5

[1] TRUE FALSE FALSE TRUE TRUE TRUE

> which(x < 3 | x > 5)

[1] 1 4 5 6

> length(which(x < 3 | x > 5))

[1] 4

> sum(x < 3 | x > 5)

[1] 4

Otros tipos de conjuntos de datos

• Arrays y matrices (matrix): representacion multidimensionalde los vectores. Todos los elementos de la matriz han de serdel mismo tipo.

• Factores (factor): utiles para el uso de datos categoricos.

• Listas (list): generalizacion de los vectores donde loselementos pueden ser de diferentes tipos (incluso vectores onuevas listas).

• Data frames: listas donde los diferentes elementos tienen lamisma longitud.

• Funciones (function): conjunto de codigo de R ejecutable yparametrizable.

Otros tipos de conjuntos de datos

• Arrays y matrices (matrix): representacion multidimensionalde los vectores. Todos los elementos de la matriz han de serdel mismo tipo.

• Factores (factor): utiles para el uso de datos categoricos.

• Listas (list): generalizacion de los vectores donde loselementos pueden ser de diferentes tipos (incluso vectores onuevas listas).

• Data frames: listas donde los diferentes elementos tienen lamisma longitud.

• Funciones (function): conjunto de codigo de R ejecutable yparametrizable.

Otros tipos de conjuntos de datos

• Arrays y matrices (matrix): representacion multidimensionalde los vectores. Todos los elementos de la matriz han de serdel mismo tipo.

• Factores (factor): utiles para el uso de datos categoricos.

• Listas (list): generalizacion de los vectores donde loselementos pueden ser de diferentes tipos (incluso vectores onuevas listas).

• Data frames: listas donde los diferentes elementos tienen lamisma longitud.

• Funciones (function): conjunto de codigo de R ejecutable yparametrizable.

Otros tipos de conjuntos de datos

• Arrays y matrices (matrix): representacion multidimensionalde los vectores. Todos los elementos de la matriz han de serdel mismo tipo.

• Factores (factor): utiles para el uso de datos categoricos.

• Listas (list): generalizacion de los vectores donde loselementos pueden ser de diferentes tipos (incluso vectores onuevas listas).

• Data frames: listas donde los diferentes elementos tienen lamisma longitud.

• Funciones (function): conjunto de codigo de R ejecutable yparametrizable.

Otros tipos de conjuntos de datos

• Arrays y matrices (matrix): representacion multidimensionalde los vectores. Todos los elementos de la matriz han de serdel mismo tipo.

• Factores (factor): utiles para el uso de datos categoricos.

• Listas (list): generalizacion de los vectores donde loselementos pueden ser de diferentes tipos (incluso vectores onuevas listas).

• Data frames: listas donde los diferentes elementos tienen lamisma longitud.

• Funciones (function): conjunto de codigo de R ejecutable yparametrizable.

Array

• Todos los datos del mismo tipo

• Atributo dim> x <- 1:42 ; dim(x) <- c(3,7,2) ; x

, , 1

[,1] [,2] [,3] [,4] [,5] [,6] [,7]

[1,] 1 4 7 10 13 16 19

[2,] 2 5 8 11 14 17 20

[3,] 3 6 9 12 15 18 21

, , 2

[,1] [,2] [,3] [,4] [,5] [,6] [,7]

[1,] 22 25 28 31 34 37 40

[2,] 23 26 29 32 35 38 41

[3,] 24 27 30 33 36 39 42

> x[15]

15

Array y seleccion de datos

> x[c(FALSE,TRUE,FALSE),-c(1,7),2]

[1] 26 29 32 35 38

> x[-2,,1]

[,1] [,2] [,3] [,4] [,5] [,6] [,7]

[1,] 1 4 7 10 13 16 19

[2,] 3 6 9 12 15 18 21

> x <- array(1:5,dim=c(3,7,2))

> x[1:2,2:5,2] <- 99 ; x

, , 1

[,1] [,2] [,3] [,4] [,5] [,6] [,7]

[1,] 1 4 2 5 3 1 4

[2,] 2 5 3 1 4 2 5

[3,] 3 1 4 2 5 3 1

, , 2

[,1] [,2] [,3] [,4] [,5] [,6] [,7]

[1,] 2 99 99 99 99 2 5

[2,] 3 99 99 99 99 3 1

[3,] 4 2 5 3 1 4 2

Matrices (un caso particular)

> a <- matrix(1:20,5,4) ; a

[,1] [,2] [,3] [,4]

[1,] 1 6 11 16

[2,] 2 7 12 17

[3,] 3 8 13 18

[4,] 4 9 14 19

[5,] 5 10 15 20

> ncol(a)

[1] 4

> b <- matrix(21:32, nrow=3, byrow=T)

> rownames(b) <- letters[1:3]; colnames(b) <- LETTERS[1:4]; b

A B C D

a 21 22 23 24

b 25 26 27 28

c 29 30 31 32

> b["a","A"]

[1] 21

> b["a",]

A B C D

21 22 23 24

rbind y cbind

> a %*% t(b)

a b c

[1,] 790 926 1062

[2,] 880 1032 1184

[3,] 970 1138 1306

[4,] 1060 1244 1428

[5,] 1150 1350 1550

> cbind(rbind(a,b),1:8)

A B C D

1 6 11 16 1

2 7 12 17 2

3 8 13 18 3

4 9 14 19 4

5 10 15 20 5

a 21 22 23 24 6

b 25 26 27 28 7

c 29 30 31 32 8

Algunas funciones

• t, det, diag

• solve(A, B) resuelve A ∗ X = B, solve(A) devuelve A−1

> apply(b, 1, sum)

a b c

90 106 122

> apply(b, 2, mean)

A B C D

25 26 27 28

> rowSums(b)

a b c

90 106 122

> colMeans(b)

A B C D

25 26 27 28

> solve(matrix(c(3,1,2,-1),nrow=2),c(5,0))

[1] 1 1

1 Introduccion

2 R Markdown

3 Vectores

4 Factores

5 Listas y marcos de datos

6 Graficos en RGraficos univariantesGraficos multivariantesAnadir otros elementos

7 Programacion en R

Factores

R maneja las variables cualitativas usando factores.

> fr <- factor(c("Sı", "No", "No", "Sı")); fr

[1] Sı No No Sı

Levels: No Sı

> table(fr)

No Sı

2 2

> fr <- factor(c("Sı", "No", "No", "Sı"), levels = c("No", "Sı", "O"),

labels = c("No fumador", "Fumador", "NS/NC")); fr

[1] Fumador No fumador No fumador Fumador

Levels: No fumador Fumador NS/NC

> table(fr)

No fumador Fumador NS/NC

2 2 0

> nlevels(fr)

[1] 3

> levels(fr)

[1] "No fumador" "Fumador" "NS/NC"

Factores ordenados

> fc <- factor(c("Muchos", "Pocos", "Pocos", "Bastantes"),

levels = c("Pocos", "Bastantes", "Muchos"),

ordered = TRUE) ; fc

[1] Muchos Pocos Pocos Bastantes

Levels: Pocos < Bastantes < Muchos

> sum(fc < "Muchos")

[1] 3

> ordered(c("Muchos", "Pocos", "Pocos", "Bastantes"),

levels = c("Pocos", "Bastantes", "Muchos"))

[1] Muchos Pocos Pocos Bastantes

Levels: Pocos < Bastantes < Muchos

> table(fr,fc)

fc

fr Pocos Bastantes Muchos

No fumador 2 0 0

Fumador 0 1 1

NS/NC 0 0 0

Factores

• La funcion tapply permite aplicar una operacion a un vectoragrupando previamente los datos en cada uno de los nivelesproporcionados por un factor.

• Reordenar los niveles de un factor: reorder (el factor cuyosniveles hay que reordenar; un vector de la misma longitud acuyos subconjuntos de valores correspondientes a cada niveldel factor se aplicara la funcion que determina el orden; esafuncion).

• Una variable cuantitativa se puede transformar en una variablecualitativa.

tapply, reorder

> head(Cebada)

Cosecha Variedad A~no Lugar

1 27.00000 Manchuria 1931 University Farm

2 48.86667 Manchuria 1931 Waseca

3 27.43334 Manchuria 1931 Morris

4 39.93333 Manchuria 1931 Crookston

5 32.96667 Manchuria 1931 Grand Rapids

6 28.96667 Manchuria 1931 Duluth

> head(Cebada$Variedad)

[1] Manchuria Manchuria Manchuria Manchuria Manchuria Manchuria

10 Levels: Glabron Manchuria No.457 No.462 No.475 ... Wisconsin No.38

> tapply(Cebada$Cosecha, Cebada$Variedad, median)

Glabron Manchuria No.457 No.462 ...

32.40000 30.96667 33.96666 30.45000 ...

> Variedad_re <- reorder(Cebada$Variedad, Cebada$Cosecha, median)

> head(Variedad_re)

Manchuria Manchuria Manchuria Manchuria Manchuria Manchuria

10 Levels: Svansota No.462 Manchuria No.475 Velvet ... Trebi

> tapply(Cebada$Cosecha, Variedad_re, median)

Svansota No.462 Manchuria No.475

28.55000 30.45000 30.96667 31.06667

Factores para variables cuantitativas

> num <- c(10, 0, 4, 8, 5, 22)

> interv <- cut(num, breaks = 4); interv

[1] (5.49,11] (-0.022,5.49] (-0.022,5.49]

[4] (5.49,11] (-0.022,5.49] (16.5,22]

Levels: (-0.022,5.49] (5.49,11] (11,16.5] (16.5,22]

> interv <- cut(num, breaks = c(0, 5, 10, 30), right=F); interv

[1] [10,30) [0,5) [0,5) [5,10) [5,10) [10,30)

Levels: [0,5) [5,10) [10,30)

> interv <- cut(num, breaks = c(0, 5, 10, 30), order=T,

labels = c("Poco","Bastante","Mucho"),

include.lowest = TRUE) ; interv

[1] Bastante Poco Poco Bastante Poco Mucho

Levels: Poco < Bastante < Mucho

> table(interv)

Poco Bastante Mucho

3 2 1

> which("Poco" < interv )

[1] 1 4 6

1 Introduccion

2 R Markdown

3 Vectores

4 Factores

5 Listas y marcos de datos

6 Graficos en RGraficos univariantesGraficos multivariantesAnadir otros elementos

7 Programacion en R

Listas

> lst <- list(nombre="Carlos", num.hijos=3, edad.hijos=c(4,7,9))

> lst$apellido <- "Garcıa"; lst

$nombre

[1] "Carlos"

$num.hijos

[1] 3

$edad.hijos

[1] 4 7 9

$apellido

[1] "Garcıa"

> length(lst)

[1] 4

> lst[1]

$nombre

[1] "Carlos"

> lst[[3]][2]

[1] 7

> lst$num.hijos

[1] 3

> lst["nombre"]

$nombre

[1] "Carlos"

Marcos de datos

> df <- data.frame(Nombre=c("Pedro","Marıa","Jose","Marta"),

Edad=c(27,34,40,39),

Poblacion=c("Malaga","Madrid","Leon","Barcelona"),

Sexo=c("H","M","H","M"),

Casado=c(F,T,T,F)); df

Nombre Edad Poblacion Sexo Casado

1 Pedro 27 Malaga H FALSE

2 Marıa 34 Madrid M TRUE

3 Jose 40 Leon H TRUE

4 Marta 39 Barcelona M FALSE

> attach(df)

> Nombre

[1] Pedro Marıa Jose Marta

Levels: Jose Marıa Marta Pedro

> Edad

[1] 27 34 40 39

> detach(df)

> Edad

Error: objeto ’Edad’ no encontrado

Marcos de datos

> names(df)

[1] "Nombre" "Edad" "Poblacion" "Sexo" "Casado"

> rownames(df)

[1] "1" "2" "3" "4"

> ncol(df)

[1] 5

> df$Nombre

[1] Pedro Marıa Jose Marta

Levels: Jose Marıa Marta Pedro

> df[1:3]

Nombre Edad Poblacion

1 Pedro 27 Malaga

2 Marıa 34 Madrid

3 Jose 40 Leon

4 Marta 39 Barcelona

> df[1,3]

[1] Malaga

Levels: Barcelona Leon Madrid Malaga

Operaciones simultaneas

• Las funciones lapply y sapply aplica una operacion a cadaelemento de una lista.

• La funcion aggregate permite aplicar una operacion a cadacolumna de un marco de datos agrupando previamente losdatos en cada uno de los niveles proporcionados por una listade factores.

Operaciones simultaneas

> df <- data.frame(altura=c(150,135,210,140), peso=c(65,61,100,65),

sexo=c("H", "M", "H", "M"))

> apply(df[-3], 2, sd)

altura peso

34.73111 18.26426

> lapply(df[-3], sum)

$altura

[1] 635

$peso

[1] 291

> sapply(df[-3], sum)

altura peso

635 291

> aggregate(df[-3], list(df$sexo), mean)

Group.1 altura peso

1 H 180.0 82.5

2 M 137.5 63.0

Marcos de datos: read.table

• Todas las filas tienen el mismo numero de elementos menos laprimera que tiene un elemento menos.

• La primera fila contiene los nombres de las columnas.

• El primer elemento del resto de filas es el nombre de cada fila

• Los datos estan separados por espacios en blanco.

• El separador de los decimales es un punto.

• Los valores desconocidos se expresan con NA.

• write.table

• read.csv,. . . (ver la ayuda)

1 Introduccion

2 R Markdown

3 Vectores

4 Factores

5 Listas y marcos de datos

6 Graficos en RGraficos univariantesGraficos multivariantesAnadir otros elementos

7 Programacion en R

Objetivos

Comunicar de ideas complejas con claridad, precision y eficiencia.

• Mostrar los datos.

• Inducir a pensar sobre el contenido en lugar de lametodologıa, el diseno grafico o la tecnologıa que lo produjo

• Evitar la distorsion en la comunicacion de los datos.

• Presentar muchos numeros en un pequeno espacio.

• Hacer que grandes conjuntos de datos tengan coherencia.

• Inducir a la comparacion entre diferentes partes de los datos.

• Revelar detalles, desde un perspectiva global o particular.

• Tener un proposito razonablemente claro: la descripcion, laexploracion, la tabulacion o la decoracion.

• Estar integrado con las descripciones estadısticas y verbales,

Recomendaciones

• Hacer que los datos sobresalgan. Evitar lo superfluo.

• Utilizar elementos prominentes para mostrar los datos.

• Hacer la region de datos menor que la region delimitada porlas escalas. Las marcas hacia afuera.

• No congestionar la region de datos.

• No exagerar el numero de marcas (de 3 a 10 marcas).

• Utilizar una lınea cuando haya un valor que deba verse atraves del grafico, pero que no interfiera con los datos.

• Las etiquetas no deben interferir o congestionar el grafico.

• Evitar colocar claves en el interior. Colocar las notas en eltexto o la explicacion.

• Los sımbolos o conjuntos de datos que se superpongan debenpoder ser reconocidos facilmente.

Dispositivos graficos

R puede generar graficos en casi cualquier tipo de dispositivografico o de impresion.

• la ventana de RStudio (por defecto);

• postscript, pdf y bmp, para generar ficheros PostScript, PDFy Mapa de Puntos (BMP)

• png y jpeg, para generar imagenes PNG y JPEG.

hist(rnorm(1000))

png(file="histograma.png")

hist(rnorm(1000))

dev.off()

X11()

hist(rnorm(1000))

savePlot(file="histograma.png", type="png")

dev.off()

Biblioteca lattice

> g1 <- densityplot(~ gcsescore | factor(score), data = Chem97,

plot.points = FALSE, ref = TRUE)

> g2 <- densityplot(~ gcsescore, data = Chem97, groups = score,

plot.points = FALSE, ref = TRUE,

auto.key = list(columns = 3))

> print(g1, split=c(1,1,2,1),more=T)

> print(g2, split=c(2,1,2,1))

Parametros comunes

En la mayorıa de las funciones graficas

• data: Marco de datos con las variables a partir de las cualesse construye el grafico

• horizontal: Determina el sentido del grafico

• main: Tıtulo principal

• sub: Subtıtulo

• xlab, ylab: Etiquetas de los ejes X e Y

• xlim, ylim: Lımites de los ejes X e Y

1 Introduccion

2 R Markdown

3 Vectores

4 Factores

5 Listas y marcos de datos

6 Graficos en RGraficos univariantesGraficos multivariantesAnadir otros elementos

7 Programacion en R

Diagrama de dispersion

Muestra los valores dibujando un punto por cada dato.

> head(faithful$eruptions)

[1] 3.600 1.800 3.333 2.283 4.533 2.883

> stripplot(~faithful$eruptions, xlab = "Duracion (en minutos)",

main = "Erupciones del geiser Old Faithful")

> plot(~faithful$eruptions, pch = 1 , xlab = "Duracion (en minutos)",

main = "Erupciones del geiser Old Faithful")

Diagrama de caja y bigote

Un rectangulo entre el primer y el tercer cuartil, en su interior lamediana. A ambos lados dos lıneas con los valores que seencuentran a lo sumo a una distancia de 1.5 veces el rangointercuartılico. Cualquier otro valor se marca individualmente.

> bwplot(~Sepal.Width, data = iris, main = "Ancho de los Sepalos",

xlab = "")

> boxplot(iris$Sepal.Width, main = "Ancho de los Sepalos", xlab = "",

horizontal=T)

Varios diagramas de caja y bigote

Para comparar las distribuciones para distintas agrupaciones en losdatos podemos realizar un diagrama por cada uno.

> bwplot(Species~Sepal.Width, data = iris,

main = "Ancho de los Sepalos", xlab = "")

> boxplot(iris$Sepal.Width ~ iris$Species, xlab = "",

main = "Ancho de los Sepalos", horizontal = T)

Histograma

Se divide el rango de datos en clases, se calcula la frecuencia dedatos para cada clase y se dibuja una barra por clase (ancho laamplitud de la clase y superficie proporcional a la frecuencia)

> histogram(~eruptions, data = faithful, type = "count",

main = "Erupciones del geiser Old Faithful",

xlab = "Duracion (en minutos)", ylab = "No de erupciones")

> hist(faithful$eruptions, xlab = "Duracion (en minutos)",

main = "Erupciones del geiser Old Faithful",

ylab = "No de erupciones", ylim = c(0, 80), xlim = c(1, 6))

Histograma (Cont.)

Fijar el numero de clases (por defecto usa la regla de Sturges,log2(n) + 1), sus extremos y/o utilizar las frecuencias relativas.

> print(histogram(faithful$eruptions, type = "percent", nint = 20),

split = c(1,1,2,1), more=T)

> print(histogram(faithful$eruptions, type = "density",

breaks = c(0, 2, 3, 3.5, 4, 4.5, 5, 5.5)),

split = c(2,1,2,1))

Histograma (Cont.)Fijar el numero de clases (por defecto usa la regla de Sturges,log2(n) + 1), sus extremos y/o utilizar las frecuencias relativas.> par(mfcol = c(1, 2))

> h = hist(faithful$eruptions, plot=FALSE, breaks = 25)

> h$density = h$counts/sum(h$counts)*100

> plot(h, freq=FALSE, ylab = "Porcentaje", main="", ylim=c(0,10),

xlab = "Duracion (en minutos)")

> hist(faithful$eruptions, breaks = c(0, 2, 3, 3.5, 4, 4.5, 5, 5.5),

ylab="Densidad", xlab="Duracion (en minutos)", main="",

ylim=c(0, 0.55))

Grafico de densidad

> Erupciones <- faithful$eruptions

> densityplot(Erupciones, plot.points = "jitter",

main = "Erupciones del geiser Old Faithful",

xlab = "Duracion (en minutos)", ylab = "Probabilidad")

> d <- density(Erupciones)

> plot(d, main="Erupciones del geiser Old Faithful",

xlab = "Duracion (en minutos)", ylab = "Probabilidad")

> points(jitter(Erupciones), jitter(rep(0,length(Erupciones)),0.25))

Opciones de plot.points: valor logico, ”rug” o ”jitter”

Superposicion

> densityplot(~height, data = singer, groups = voice.part,

bw = 1.5, auto.key = list(columns = 4))

Diagrama de barras

Una barra por cada dato, la longitud de cada barra es proporcionalal valor del dato. Para conjuntos de datos pequenos.

> drosophila <- read.table("drosophila.txt")

> barchart(sort(tapply(drosophila$fecundidad, drosophila$linea, mean)),

xlab="", main="Fecundidad media de cada lınea genica")

> par(mar = c(5,6,4,2)+0.1)

> barplot(sort(tapply(drosophila$fecundidad, drosophila$linea, mean),

decreasing=T),

xlab="", main="Fecundidad media de cada lınea genica",

horiz=T, xlim=c(0, 35), las=1)

Diag. de barras (variables cualitativas)

Frecuencias absolutas de los distintas categorıas de esa variable.

> barchart(table(iris$Species), horizontal=FALSE,

main = "Numero de plantas estudiadas segun la especie",

xlab = "Especie de lirio")

> barplot(table(iris$Species), xlab = "Especie de lirio",

main = "Numero de plantas estudiadas segun la especie")

Superposicion

Por cada grupo de valores, un grupo de barras

> barchart(Departamento ~ Solicitudes, groups = Resultado,

data = UCBAdmisiones, auto.key=T)

Diagrama de puntos

Un punto por cada dato en una coordenada vertical distinta.

> dotplot(sort(islands[islands < islands["Java"]]),

xlab="Superficie en millas cuadradas")

> dotchart(sort(islands[islands < islands["Java"]]),

xlab="Superficie en millas cuadradas")

1 Introduccion

2 R Markdown

3 Vectores

4 Factores

5 Listas y marcos de datos

6 Graficos en RGraficos univariantesGraficos multivariantesAnadir otros elementos

7 Programacion en R

Diagrama de dispersion bivariante

Dibuja un punto por cada par de valores.ejeY ~ ejeX

> A~no <- 1700:1988

> xyplot(sunspot.year ~ A~no)

> xyplot(sunspot.year ~ A~no, type = "b")

> xyplot(sunspot.year ~ A~no, type = "s")

Matriz de diagramas de dispersion> splom(environmental)

Tecnicas de visualizacion (I)

Anadir una ligera perturbacion a los datos: jitter

> xyplot(Sepal.Length ~ Petal.Length, data = iris)

> xyplot(jitter(Sepal.Length) ~ jitter(Petal.Length), data = iris)

Tecnicas de visualizacion (II)

Razon de aspecto: Relacion entre la altura y la anchura

> f <- function (x) {if (x < 0) x^2 else 10*x}

> ex <- -10:10 ; ey <- sapply(ex, f)

> xyplot(ey ~ ex, type = "l", aspect = 1, xlab = "x", ylab = "f(x)")

> xyplot(ey ~ ex, type = "l", aspect = 1/10, xlab = "x", ylab = "f(x)")

> xyplot(ey ~ ex, type = "l", aspect = 10, xlab = "x", ylab = "f(x)")

Regresion lineal simple

Anadir la recta de regresion

> lm(ozone ~ wind, data = environmental)

Coefficients:

(Intercept) wind

99.054 -5.731

> xyplot(ozone ~ wind, data = environmental, type = c("p", "r"),

aspect = "xy")

Ajuste de una curva

Ajuste de loess:

• alfa (span): si aumenta la curva se hace mas suave

• lambda (degree): grado de ciertos polinomios (1 o 2)

> xyplot(ozone ~ wind, data = environmental, type = c("p", "smooth"),

aspect = "xy", span = 0.6, degree = 2)

Distribucion en paneles (trellis)

En cada panel se dibuja el grafico correspondiente a unsubconjunto de datos que se obtienen a partir de variablescondicionantes:

• ~ x | g1 * g2 * ...: histograma, grafico de densidad,matriz de dispersion

• y ~ x | g1 * g2 * ...: diagramas de caja y bigote,barras, puntos y dispersion

> dotplot(variety ~ yield | year * site, data = barley,

xlab="", layout = c(6,2))

Condicionante cuantitativa

> E.shingle <- equal.count(ethanol$E, number = 9, overlap = 1/4)

> xyplot(NOx ~ C | E.shingle, data = ethanol, aspect = "xy",

xlab = "Razon de compresion",

ylab = "Oxidos de nitrogeno (microgramos/J)")

Superposicion de paneles

> xyplot(Sepal.Length+Sepal.Width ~ Petal.Length+Petal.Width | Species,

data = iris, auto.key = list(column = 2),

xlab = "Longitud y anchura del petalo",

ylab = "Longitud y anchura del sepalo")

1 Introduccion

2 R Markdown

3 Vectores

4 Factores

5 Listas y marcos de datos

6 Graficos en RGraficos univariantesGraficos multivariantesAnadir otros elementos

7 Programacion en R

Formato del punto y datos extra

> xyplot(1:10 ~ 1:10)

> xyplot(1:10 ~ 1:10, pch=3, col="red")

> xyplot(1:10 ~ 1:10,

panel = function (x, y) {

panel.xyplot(x, y, pch=3, col="red")

panel.points(c(2,2), c(4,5), pch=5, col="blue")})

Formato del punto y datos extra

> xyplot(1:10 ~ 1:10)

> xyplot(1:10 ~ 1:10, pch=3, col="red")

> xyplot(1:10 ~ 1:10,

panel = function (x, y) {

panel.xyplot(x, y, pch=3, col="red")

panel.points(c(2,2), c(4,5), pch=5, col="blue")})

Formato del punto y datos extra

> xyplot(1:10 ~ 1:10)

> xyplot(1:10 ~ 1:10, pch=3, col="red")

> xyplot(1:10 ~ 1:10,

panel = function (x, y) {

panel.xyplot(x, y, pch=3, col="red")

panel.points(c(2,2), c(4,5), pch=5, col="blue")})

Leyenda

> attach(iris)

> xyplot(Sepal.Width ~ Sepal.Length, groups = Species, auto.key = TRUE)

> xyplot(Sepal.Width ~ Sepal.Length, groups = Species,

auto.key = list(corner=c(1,0.95), lines=T, points=F,

text=c("Setosa","Versicolor","Virginica")))

> xyplot(Sepal.Width ~ Sepal.Length, groups = Species, pch=4:6, col=2:4,

key = list(corner=c(1,0.95), lines=list(col=2:4, lty=1:3),

text=list(c("Setosa","Versicolor","Virginica"), font=3)))

Leyenda

> attach(iris)

> xyplot(Sepal.Width ~ Sepal.Length, groups = Species, auto.key = TRUE)

> xyplot(Sepal.Width ~ Sepal.Length, groups = Species,

auto.key = list(corner=c(1,0.95), lines=T, points=F,

text=c("Setosa","Versicolor","Virginica")))

> xyplot(Sepal.Width ~ Sepal.Length, groups = Species, pch=4:6, col=2:4,

key = list(corner=c(1,0.95), lines=list(col=2:4, lty=1:3),

text=list(c("Setosa","Versicolor","Virginica"), font=3)))

Leyenda

> attach(iris)

> xyplot(Sepal.Width ~ Sepal.Length, groups = Species, auto.key = TRUE)

> xyplot(Sepal.Width ~ Sepal.Length, groups = Species,

auto.key = list(corner=c(1,0.95), lines=T, points=F,

text=c("Setosa","Versicolor","Virginica")))

> xyplot(Sepal.Width ~ Sepal.Length, groups = Species, pch=4:6, col=2:4,

key = list(corner=c(1,0.95), lines=list(col=2:4, lty=1:3),

text=list(c("Setosa","Versicolor","Virginica"), font=3)))

Superponer distintos graficos

> a <- rnorm(1000)

> histogram(~ a, type = "density",

panel = function(x, ...) {

panel.histogram(x, ..., col="blue", border="white")

panel.densityplot(x,..., col = "orange", lwd=3)})

> histogram(~ a, type = "density",

panel = function(x, ...) {

panel.histogram(x, breaks=25, col="blue", border="white")

panel.densityplot(x,..., col = "orange", lwd = 3)})

Escala logarıtmica y curva suavizada

> xyplot(dist ~ speed, data = cars, type=c("p","smooth"), span=1,

main = "Conjunto de datos: cars",

xlab = "Velocidad (mph)", ylab = "Distancia de franado (ft)")

> xyplot(log10(dist) ~ log10(speed), data = cars,

type=c("p","smooth"), span=1,

main = "Conjunto de datos: cars (escala logartıtmica)",

xlab = "Velocidad (mph)", ylab = "Distancia de franado (ft)")

Escala logarıtmica y curva suavizada

> xyplot(dist ~ speed, data = cars, type=c("p","smooth"), span=1,

main = "Conjunto de datos: cars",

xlab = "Velocidad (mph)", ylab = "Distancia de franado (ft)")

> xyplot(log10(dist) ~ log10(speed), data = cars,

type=c("p","smooth"), span=1,

main = "Conjunto de datos: cars (escala logartıtmica)",

xlab = "Velocidad (mph)", ylab = "Distancia de franado (ft)")

Escala logarıtmica y curva suavizada

> xyplot(dist ~ speed, data = cars,

main = "Conjunto de datos: cars (escala logarıtmica)",

xlab = "Velocidad (mph)", ylab = "Distancia de franado (ft)",

scales = list(x=list(equispaced.log = FALSE,log=TRUE),

y=list(equispaced.log = FALSE,log=TRUE),

col="green"),

panel = function(x, y) {panel.xyplot(x, y)

panel.loess(x, y, span=1, col="red")})

Otras opciones (I)

Para cualquiera de los tıtulos

> xyplot(ozone^0.5 ~ wind, data = environmental,

ylab = expression(sqrt("Concentracion de ozono")),

xlab = list(label = "Velocidad del viento",

cex = 2, col = "red", font = 3))

Otras opciones (II)

Elegir parte de un factor

> bwplot(Species ~ Sepal.Length, data = iris,

subset = Species != "setosa")

Otras opciones (III)

Recorrido y seleccion de paneles

> histogram(~ height | voice.part, data = singer, layout = c(3, 3))

> histogram(~ height | voice.part, data = singer, layout = c(3, 3),

as.table=T, skip = c(rep(FALSE, 4), TRUE, rep(FALSE, 4)))

Otros elementos...

> rojos <- runif(10,1,10) ; verdes <- runif(10,1,10)

> lineas <- runif(10, 1, 10) ; textos <- runif(10,1,10)

> poligono <- runif(8,1,10)

> xyplot(1:10 ~ 1:10, xlab = "", ylab = "", col="black",

scales = list(x = list(labels=c("uno", "tres", "cinco",

"siete", "nueve"),

at = seq(1,10,by=2)),

y = list(labels=1:10, at=1:10)),

main = "Grafico inventado",

key = list(text = list(c("uno", "dos", "tres")),

x=0.8, y=0.3, lines=list(col=rainbow(3), lty=1:3)),

panel = function (x, y, ...) {

panel.xyplot(x, y, ...)

panel.points(rojos[1:5], rojos[6:10], cex=1.5, col="red")

panel.points(verdes[1:5], verdes[6:10], cex=1.7, col="green",

pch="+")

panel.lines(1:10, lineas, lty=2, lwd=2, col="black")

panel.text(textos[1:5], textos[6:10], cex=1.7, col=rainbow(5),

labels = c("uno", "dos", "tres", "cuatro", "cinco"))

panel.abline(h=5, lty=4)

panel.polygon(poligono[1:4], poligono[5:8], col="blue")})

1 Introduccion

2 R Markdown

3 Vectores

4 Factores

5 Listas y marcos de datos

6 Graficos en RGraficos univariantesGraficos multivariantesAnadir otros elementos

7 Programacion en R

Agrupacion de expresiones

• Las expresiones pueden ser agrupadas entre llaves:

• En una misma lınea han de separarse por ;

{

a <- 0; b <- 1

c <- a+b

}

• El valor que devuelve el grupo es el valor de la ultimaexpresion

Condicional: ifif (condicion) consecuencia [else alternativa]

• condicion tiene que devolver un unico valor logico• Si consecuencia y/o alternativa son un grupo de expresiones

han de ir entre llaves• Si condicion devuelve el valor TRUE se obtiene el valor de

consecuencia• en caso contrario, se obtiene el valor de alternativa

> c <- 0:10 < 9 & 3 < 0:10

> c

[1] FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE

> a <- 10:20

> b <- 40:50

> if (TRUE) a + b else a * b

[1] 50 52 54 56 58 60 62 64 66 68 70

> if (c) a + b else a * b

[1] 400 451 504 559 616 675 736 799 864 931 1000

Warning message:

In if (c) a + b else a * b :

la condicion tiene longitud > 1 y solo el primer elemento sera usado

>

Condicional: ifelse

ifelse(condicion,a,b)

• Devuelve un vector de la misma longitud que condicion, conlos elementos a[i] si condicion[i] tiene el valor TRUE, y b[i] encaso contrario.

> c <- 0:10 < 9 & 3 < 0:10

> c

[1] FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE

> a <- 10:20

> b <- 40:50

> ifelse(c, a, b)

[1] 40 41 42 43 14 15 16 17 18 49 50

for, while, repeat

for (var in vector) expr

• expr se calcula tantas veces como elementos tenga vector

• la variable var toma como valor, en cada ocasion, cada unode los elementos de vector

while (condicion) expr

• se calcula expr mientras condicion tenga el valor TRUE

repeat expr

• se calcula expr mientras no se interrumpa explıcitamente conla instruccion break.

Ejemplos> a <- 1:5000; b <- 11:5010

> system.time(res <- a+b)

user system elapsed

0 0 0

> system.time({resFor <- c() ;

for (i in 1:5000) resFor[i] <- a[i]+b[i]})

user system elapsed

0.026 0.000 0.025

> system.time({resWhile <- c() ; i<-1 ;

while (i <= 5000) {resWhile[i] <- a[i]+b[i] ; i<- i+1}})

user system elapsed

0.028 0.000 0.027

> system.time({resRepeat <- c() ; i<-1 ;

repeat {if (i<=5000) {resRepeat[i] <- a[i]+b[i] ; i<- i+1}

else break}})

user system elapsed

0.028 0.000 0.028

> identical(res,resFor)

[1] TRUE

> identical(resFor,resWhile)

[1] TRUE

> identical(resWhile,resRepeat)

[1] TRUE

Definicion de funciones

nombre <- function(var1,...,varn) expr

• expr es una agrupacion de expresiones que utilizan var1,. . . varn

nombre(arg1,..., argn)

• valor de expr tras sustituir cada vari por el valor de argi

> ecGrado2 <- function(a, b, c)

{ disc <- (b^2)-(4*a*c)

sol1 <- (-b + sqrt(disc))/(2*a)

sol2 <- (-b - sqrt(disc))/(2*a)

c(sol1,sol2)

}

> ecGrado2(2,4,1)

[1] -0.2928932 -1.7071068

> "%porcentaje%" <- function(a,b) (a/(a+b))*100

> 4 %porcentaje% 6

[1] 40

>

Recommended