1. CONSTANTES

2. VARIABLES Y ASIGNACIONES

2. VECTORES

c(0,2,4)
c("hola", "adiós", "hasta luego")
c(TRUE, TRUE, FALSE)
1:10
seq(from=0, to=1, length=5)
seq(from=0, to=1, by=0.1)
rep(x=1:3, each=10)
rep(x=1:3, times=5)
rep(x=1:3, times=c(5,2,4))

3. FUNCIONES

# Función 'sample()' simula extracciones aleatorias de una urna de objetos
# Argumentos:
#   x: vector de los objetos de la urna
#   size: número de extracciones
#   replace: extracciones con restitución de los objetos? TRUE por defcto
#   prob: vector de probabilidades de los objetos (iguales por defecto)
sample(x=1:6, size=100, replace=TRUE, prob=NULL) # versión completa 
sample(6, 100, TRUE, NULL) # versión sin nombres de argumento
sample(TRUE, 6, NULL, 100) # versión equivocando el orden de los argumentos
sample(100, 6, TRUE, NULL) # otra versión equivocando el orden
sample(replace=TRUE, x=6, prob=NULL, size=100) # versión desordenada pero ok 
nombreFuncion = function(arg1, arg2, ...) {
  # cuerpo de la función
  # return(expression) # opcional
}
# función que suma algunos términos de una série geométrica
# r^0 + r^1 + r^2 + ...
# pero que se pueda elegir dónde comienza y dónde acaba
serie.geom = function(razon=1, inicio=0, fin=0) {
  valores = razon^(inicio:fin)
return( sum(valores) )  
}
serie.geom(razon=2, inicio=0, fin=3)
serie.geom(razon=2, fin=3) # observa cómo usa valores por defecto 
serie.geom(inicio=0, fin=3)
serie.geom()

4. ALGUNAS FUNCIONES Y OPERACIONES IMPORTANTES CON VECTORES

v = 1:10
ls()
v^c(2,1)
v - 5
sqrt(v-5)
sort(c(5,-1,20,0,13,14))
order(c(5,-1,20,0,13,14))
diff(c(5,-1,20,0,13,14))

5. INDEXACIÓN DE VECTORES (SUBVECTORES)

letters # vector de letras del abecedario (ya creado en R)
v = letters[1:5] # de la "a" a la "e"
v # imprime v en pantalla
set.seed(2019) # para hacer simulaciones repetibles
# simulación con remplaz. de 100 letras entre "a" y "e" equiprobables
w = sample(x=v, size=100, replace=TRUE)
w # imprime datos simulados
# ¿cuántos datos tiene el vector?
length(w)
# ¿cuáles son los 10 primeros datos?
w[1:10]
# ¿y si me interesa descartar los 10 primeros datos?
w[-(1:10)]
# ¿cuántas letras "a" hay en el vector w?
w=="a" # hace comparaciones, y devuelve TRUEs y FALSEs (100 en total)
w[w=="a"] # selecciona de w solo las componentes de los TRUEs
length(w[w=="a"]) # finalmente cuenta cuántas hay
# ¿cuántas "vocales" hay en el vector w?
w[w=="a" | w=="e"] # seleccionamos las que son vocales
length(w[w=="a" | w=="e"]) # respuesta a la pregunta

6. MATRICES

m1 = matrix(data=1:12, nrow=3)
m1
m2 = matrix(data=1:12, nrow=3, byrow=TRUE)
m2
m2[3,4] # elemento
m2[2,] # fila 2
m2[,3] # columna 3
m2[c(1,3), c(2,3)] # submatriz

7. HOJAS DE DATOS

data(mtcars) # carga hoja de datos "mtcars" en R
mtcars # imprime en pantalla los datos
str(mtcars) # estructura de la hoja de datos
names(mtcars) # etiquetas de las columnas (las variables)
row.names(mtcars) # etiquetas de las filas (cada fila, un coche)
# datos de la columna "mpg"
mtcars$mpg
# datos de columna "mpg" pero de coches con 4 cilindros (columna "cyl")
mtcars$mpg[mtcars$cyl==4]
# hoja de datos solo con columnas "disp" y "mpg" en este orden
mtcars[,c('disp', 'mpg')]
# hoja de datos solo con columnas "disp" y "mpg" en este orden
# pero solo de coches de 4 cilindros
mtcars[mtcars$cyl==4, c('disp', 'mpg')]

8. LISTAS

# creamos una lista simple
l1 = list(mensaje="Ha funcionado", muestra=c(5.5, 10.4, 2.8), estad=4.8, facil=TRUE)
l1 # miramos la lista
l1[[2]] # accedemos a la segunda componente
l1[["muestra"]] # accedemos a la componente etiquetada como "muestra"
l1$muestra # accedemos a la componente etiquetada como "muestra"
# ejemplo de lista creada por la función t.test() de R
contraste = t.test(x=1:10, mu=5, conf.level=0.99)
str(contraste) # estructura del objeto devuelto por t.test()
contraste$p.value # accedemos al p-valor
contraste$conf.int # accedemos al intervalo de confianza

9. ESTRUCTURAS DE FLUJO

9.1. Bucles for():

  • Para repetir una tarea cambiando un valor de contador
  • La sintaxis es:
for(contador in vector) {
  # cuerpo del bucle
}
  • donde:
    • contador es un nombre arbitrario.
    • in es palabra reservada (obligatoria).
    • vector es un vector concreto definido ahí mismo (o antes).
  • Se crea la variable contador que, en cada ciclo del bucle, tomará un valor del vector vector.
  • Los bucles son lentos en R. Si puedes, evítalos, usando directamente operaciones con vectores (que son rápidos).
  • Ejemplo:
for(i in 1:3) { 
  warning("Step ", i, "!!!")
}

9.2. Condicional if()

  • Para hacer una tarea si se cumple una condición.
  • La sintaxis es:
if(expresion) {
  # parte que se procesa si expresion es TRUE
} else {
  # parte que se procesa si expresion es FALSE
}
  • donde:
    • expresion es un valor lógico (normalmente resultado de una comparación).
    • el bloque de else { } es opcional.
  • Ejemplo:
nota = 5.0
if(nota >= 5) {
  warning("Aprobado!")
} else {
  warning("Suspendido!")
}
nota = 4.9
if(nota >= 5) {
  warning("Aprobado!")
} else {
  warning("Suspendido!")
}

9.3. Manejo de los errores

  • A veces, los datos que proporciona el usuario no permiten hacer operaciones, y la función no puede continuar. Se ha de informar al usuario para que pueda reaccionar.
  • Otras veces, los cálculos se pueden hacer, pero no se cumplen ciertas condiciones para que sean buenos cálculos. Se puede continuar pero también se ha de informar al usuario de los riesgos.
  • La forma más habitual de manejar estas situaciones es usar bloques condicionales if(), con las siguientes funciones:
    • stop("expresion"): termina el proceso, devolviendo Error, con el mensaje "expresion".
    • warning("expresion"): continua el proceso, pero escribe el mensaje "expresion".
  • Otra forma es stopifnot(condicio1, condicio2, ...), que termina el proceso, devolviendo Error, si no se cumple alguna de las condiciones lógicas indicadas.
  • Ejemplo:
warning("Un aviso por algo")
stop("Algo prohibido")
stopifnot(1<2, 1==1, 3<2, 5<7)

10. VECTORIZACIÓN

# CAMBIAR eval=TRUE arriba para que evalue este bloque
# versión incorrecta (no vectorial)
funcionRara = function(x) {
  if(x <= 5) {
    return(x^2)
  } else {
    return(-x)
  }
}
funcionRara(x=3)
funcionRara(x=5)
funcionRara(x=6)
funcionRara(x=c(3,5,6))
#
# versión correcta (pero no vectorial!!!)
funcionRara2 = function(x) {
  y = numeric(length(x))
  for(i in 1:length(x)) {
    if(x[i] <= 5) {
      y[i] = x[i]^2
    } else {
      y[i] = - x[i]
    }
  }
  return(y)
}
funcionRara2(x=3)
funcionRara2(x=5)
funcionRara2(x=6)
funcionRara2(x=c(3,5,6))
#
# versión correcta (y vectorial!!!)
funcionRara3 = function(x) {
  y = numeric(length(x))
  cond1 = (x <= 5) 
  cond2 = (x > 5) 
  x1 = x[cond1]
  x2 = x[cond2]
  y[cond1] = x1^2
  y[cond2] = - x2
  return(y)
}
funcionRara3(x=3)
funcionRara3(x=5)
funcionRara3(x=6)
funcionRara3(x=c(3,5,6))
# la dibujamos
x = seq(from=0, to=10, length=100)
y = funcionRara3(x)
plot(x=x, y=y, type='l') # para ver la gràfica

11. OTRAS FUNCIONES DE INTERÉS

unique(c(1,2,3,3,3,2,1,2,1))
diff(c(1,2,3,3,3,2,1,2,1))
eval(call("sum", 1:4))
is.numeric(1:3)
is.numeric(c("a", "b", "c"))

12. EJERCICIOS EVALUABLES

12.1. CONVERTIR DATOS NUMÉRICOS EN SIGNOS: Escribe una función num2signs() que cumpla los siguientes requisitos:

# Escribe aquí tu solución

# Ejemplos para chequear si está bien
num2signs(x=c(1,2,3,4,3,1,5), type="increment") # 1  1  1 -1 -1  1
num2signs(x=c(3,3,7,7,7,7,7), type="increment") # 1
num2signs(x=c(1,2,3,4,3,1,5), type="median") # -1 -1  1 -1  1
num2signs(x=c(3,3,7,7,7,3,7), type="median") # -1 -1  1  1  1 -1  1

12.2. NÚMERO DE RACHAS DE UNA CADENA DE SIGNOS: Escribe una función nruns() que cumpla los siguientes requisitos:

# Escribe aquí tu solución

# Ejemplos para chequear si está bien
nruns(x=c(1,1,1,1,1,1,1)) # 1
nruns(x=c(1,-1,-1,-1,-1,-1,-1)) # 2
nruns(x=c(-1,-1,1,-1,1,-1,-1)) # 5

12.4. LA DISTRIBUCIÓN DE PROBABILIDAD DEL NÚMERO DE RACHAS: Define en R la función druns() que cumpla los siguientes requisitos:

# Escribe aquí tu solución

# Ejemplos
druns(x=2:3, n1=2, n2=1) # 0.66667, 0.333333
druns(x=2:3, n1=3, n2=1) # 0.5, 0.5
druns(x=2:3, n1=4, n2=1) # 0.4, 0.6
druns(x=2:4, n1=2, n2=2) # 0.333333, 0.333333, 0.333333
druns(x=2:5, n1=3, n2=2) # 0.2, 0.3, 0.4, 0.1
druns(x=2:11, n1=10, n2=5) # 0.0006660007 0.0043290043 0.0239760240 0.0659340659 0.1438561439 0.2157842158 0.2237762238 0.1958041958 0.0839160839 0.0419580420

12.5. CONTRASTE DE ALEATORIEDAD POR RACHAS: Implementa una función runs.test() que realice el contraste de aleatoriedad (por rachas) para muestras pequeñas, según la estructura que se propone (usará las funciones de los ejercicios anteriores):

# Escribe aquí tu solución

# Ejemplos
runs.test(x=c(1,2,3,4,3,1,5), type="increment") # $R=3 $p.value=0.6
runs.test(x=c(3,3,7,7,7,7,7), type="increment") # $R=2 $p.value=0.0952381
runs.test(x=c(1,2,3,4,3,1,5), type="median") # $R=4 $p.value=1
runs.test(x=c(3,3,7,7,7,3,7), type="median") # $R=4 $p.value=1

12.6. CONTRASTE DE HIPÒTESIS SIMPLES: Define la función simple.test() que cumpla los siguientes requisitos:

# Escribe aquí tu solución

# Ejemplos
simple.test(x=c(0.1, 0.2, 0.3), f0="dunif", f1="dexp", a=1, b=1) # 0.4511884, "Aceptar H0"
simple.test(x=c(0.1, 0.2, 0.3), f0="dunif", f1="dexp", a=1, b=10) # -4.488116, "Rechazar H0"
simple.test(x=c(0.1, 0.2, 0.3), f0="dunif", f1="dnorm", a=1, b=1) # 0.9407989, "Aceptar H0"
simple.test(x=c(0.1, 0.2, 0.3), f0="dunif", f1="dnorm", a=1, b=10) # 0.4079893, "Aceptar H0"