Introducción al Software R en Estadística
Introducción al Software R en Estadística
SOFTWARE R
INTRODUCCIÓN
Bienvenidos al primer tema del Máster, en el que vamos a introducirlos en el Software R. Ilustraremos cada paso
con ejemplos fáciles de seguir. Los códigos para completar cada tarea se encuentran adjuntos en la carpeta del
TEMA 1.
Al final del capítulo será capaz de manipular sus datos aplicando distintas funciones y de apreciar el significado del
siguiente código (Fuente: R for dummies, 2012):
knowledge<-apply(theory, 1, sum)
En el primer capítulo veremos la descripción e historia del Software R. Conoceremos qué es R y por qué
actualmente es la herramienta estadística más potente. A continuación detallaremos cómo decargar e instalar la
última versión de R y explicaremos la interfaz de trabajo. En el capítulo 3 observaremos los conceptos básicos del
lenguaje para la manipulación y análisis de datos. Para luego estudiar las operaciones básicas, y utilizar R para
realizar procesamiento de datos y análisis estadístico básico. Veremos cómo encontrar ayuda sobre las funciones
de R, artículos explicativos, y aprender a citar el software y los paquetes con los que trabajo. El sexto capítulo trata
sobre la manipulación de datos en R y cómo crear gráficos bonitos para visualizar nuestros datos. Finalmente una
serie de ejercicios nos permitirá poner en práctica lo aprendido.
1. Descripción e historia
1.1 ¿Qué es R?
R fue creado en 1993 por Ross Ihaka y Robert Gentleman del Departamento de Estadística de la Universidad de
Auckland, New Zealand. Su nombre es en parte al reconocimiento de la influencia del lenguaje S (otro software
estadístico desarrollado por de J. Chambers et al., en Bell Laboratories desde finales de 1970) y en parte para hacer
gala de sus propios logros (ya que refiere a las iniciales de ambos autores). Sin embargo, a diferencia del lenguaje S,
R es un software de código abierto (Open Source, parte del proyecto GNU, como GNU-Linux o Mozilla Firefox), lo
cual significa que cualquiera puede descargar y modificar su código de manera gratuita. R se distribuye bajo la
licencia GNU GPL (General Public License), esta licencia no tiene restricciones de uso, sólo obliga a que la
distribución sea siempre GPL (puedes verlo aquí). Es decir, si cambias o redistribuyes el código de R, esos cambios
deben estar disponibles para todo público.
Figura 3. Los creadores de R, Ross Ihaka y Robert Gentleman.
R permite acceder a su código, modificarlo y mejorarlo. Gracias a poder acceder a su código, el software deja de
ser la caja negra típica de otros softwares estadísticos comerciales (como SPSS). Como resultado, R forma parte de
un proyecto colaborativo, donde la comunidad de usuarios (integrada por programadores de alto nivel) contribuye a
desarrollar nuevas funciones y paquetes que rápidamente son accesibles a todo público. Esto hace que R sea estable
y confiable.
R está disponible para todos los sistemas operativos (Windows, Macintosh y sistemas Unix -como Linux-).
R trabaja con otros lenguajes. R permite leer datos de softwares como SPSS, SAS, Stata y otros (mediante el
paquete foreign ), así como datos de Excel. R conecta con sistemas de bases de datos que utilizan Open Database
Connectivity protocol (ODBC, mediante el paquete RODBC ) o a las bases de datos Oracle (mediante el paquete
ROracle ). R también permite utilizar código de lenguajes como C++, Java, Python, etc., ya que R se basa en lenguaje
Fortran y C.
R es un lenguaje Orientado a Objetos: significa que las variables, datos, funciones, resultados, etc., se guardan en
la memoria activa del computador en forma de objetos con un nombre específico. El usuario puede modificar o
manipular estos objetos con operadores (aritméticos, lógicos, y comparativos) y funciones (que a su vez son objetos).
Mientras que programas más clásicos muestran directamente los resultados de un análisis, R guarda estos resultados
como un objeto, de tal manera que se puede hacer un análisis sin necesidad de mostrar su resultado inmediatamente.
Esto puede ser un poco extraño para el usuario, pero esta característica suele ser muy útil. Otras características de
los lenguajes orientados a objetos son la herencia: las subclases heredan las características de las superclases, y el
polimorfismo -la misma operación aplicada a diferentes objetos- resulta en diferentes implementaciones. Por ejemplo,
la lista de números 1,2,3 se asigna al objeto x, por lo que si queremos ver cómo está formado x debemos llamar a
este objeto.
x<-1:3 #para crear una secuencia de números basta con usar el operador ":"
x
## [1] 1 2 3
R es un lenguaje basado en vectores, lo cual permite aplicar cálculos a un conjunto de valores a la vez sin la
necesidad de utilizar una funciónbucle (loop). Un vector es una fila o columna de números o caracteres, por ejemplo, el
objeto x del párrafo anterior es también un vector. Si queremos sumarle 2 a cada elemento del vector, debemos
escribir:
x+2
## [1] 3 4 5
x+5:7
## [1] 6 8 10
R es un lenguaje interpretado (como Java) y no compilado (como Fortran o Pascal), lo cual significa que los
comandos escritos en el teclado son ejecutados directamente sin necesidad de construir un ejecutable.
Ventajas
Algunos conceptos que hacen de R un software único, incluyen:
Es una herramienta muy poderosa para todo tipo de procesamiento y manipulación de datos.
Es gratuito y de código abierto.
Ambiente de trabajo muy flexible y extensible.
Existe una gran comunidad de usuarios y programadores que actualizan y agregan constantemente funciones y
paquetes de funciones.
Gráficos de alta calidad exportables en diversos formatos: PostScript,pdf, bitmap, pictex, png, jpeg, etc..
Consume pocos recursos informáticos.
Puede ejecutarse de manera remota (telnet).
Gran cantidad de información sobre sus funciones y paquetes de funciones.
Desventajas
Las dificultades de R se relacionan con:
Sintaxis exigente
Documentación muy amplia y dispersa, que puede resultar difícil.
Algunos paquetes no han sido muy contrastados.
Utiliza la línea de comandos y no un interfaz gráfica, esto lleva mucho tiempo de adaptación y práctica.
En este tema intentamos familiarizarte con el uso de R, pero lo importante es que pases un tiempo frente al
ordenador practicando y, por qué no, jugando con él.
De interés...
Puedes descargar R de la página oficial. En esta página también puedes encontrar información sobre las
posibilidades que ofrece R, sus paquetes, documentación y manuales online, listas de correo, conferencias y
publicaciones. Depende del sistema operativo, pero todas las versiones se pueden encontrar en la página oficial.
Windows: se debe descargar el ejecutable y ejecutar el fichero. Se instalará el sistema base y los paquetes
recomendados.
GNU-Linux: tenemos dos opciones, 1) obtener el archivo tar, compilar desde las fuentes, descargar los
paquetes adicionales e instalar; 2) Obtener los archivos binarios (ej. los archivos deb para Debian, rpm para
RedHat, SuSE, Mandrake).
Mac: tan sólo tienes que descargar e instalar la versión de R para Mac OS desde el CRAN.
Hacer doble clic en el icono. Se abrirá la consola de R llamada Rgui (Gui, Graphical User Interface), con un
mensaje de inicio.
Iniciar R desde una interfaz gráfica (ej. RStudio o Tinn-R).
Desde una ventana del sistema ejecutar Rterm; parecido a R en Unix o Linux.
Teclear R en una shell.
Una vez iniciado R, veremos que se trabaja con un sistema de ventanas. La ventana del código o donde escribimos
los comandos, la correspondiente a los gráficos y la consola donde observamos las salidas de las órdenes
ejecutadas.
Figura 4. R, sistema de ventanas.
R no es una aplicación, es decir, podemos elegir nosotros mismos qué editor de texto queremos utilizar junto con
R. Algunas de las ventajas de los editores de texto es que permiten comprobar si hemos escrito bien el código
indicando, por ejemplo, si nos falta ningún paréntesis. Existen varios editores de R disponibles, por ejemplo:
RStudio. También es de código abierto y está disponible para todos los sistemas operativos. RStudio tiene un
resaltador de código que nos indica con diferentes colores las palabras claves, variables y símbolos, haciendo
más sencilla la creación de código en R. También tiene la posibilidad de completar el código, por lo que no
tienes que recordar todos los comandos. Presenta una pestaña de consulta a la ayuda de R, con buscador
propio, nos permite observar el listado de variables y valores que tenemos en nuestra área de trabajo, los
paquetes instalados y los gráficos que vayamos haciendo. Además tiene una gran ventaja, permite trabajar con
archivos Shiny, Markdown, Sweave, etc., con lo que podremos generar aplicaciones, escribir informes
reproducibles y dinámicos con R, con texto en formato Latex, y exportar nuestros resultados a formatos doc,
pdf, html, etc.. ¡Sin dudas, es mi favorito y los animo a que lo prueben!
Tinn-R. Es específico de R, disponible para Windows. Es más sencillo que los dos siguientes pero tiene menos
prestaciones.
Eclipse StatET. Es útil sobretodo si quieres tabajar con proyectos largos de desarrollo de software. Requiere
Java.
Emacs Speaks Statistics. Disponible para Linux y Windows. Es útil por sus atajos de teclados, en particular
para los que estén familiarizados con Linux.
En adelante, trabajaremos con el editor RStudio. Para abrir el programa basta con hacer doble click en el ícono de
RStudio. Observaremos 4 áreas de trabajo. En la esquina superior izquierda tienes el editor de texto, debajo a la
izquierda la consola (console, idéntica al RGui), arriba a la derecha el área de trabajo (workspace) y el historial
(history) y debajo a la derecha tienes varias pestañas que corresponden a tus archivos (files), gráficos (plots), la lista
de paquetes (package) y la página de ayuda (help).
Toma nota...
1. Para enviar una línea individual de código del editor a la consola, basta con hacer posicionarse en dicha línea y
hacer clic en el botón Run o recurrir al atajo de teclado Ctrl+Enter.
2. Para enviar un grupo de líneas de código del editor a la consola debemos seleccionar el grupo de órdenes que
queremos enviar y repetir el mismo procedimiento anterior.
3. Para enviar todo el código a la consola utilizamos el botón Source o el atajo de teclado Ctrl+Shift+Enter.
Como comenté anteriormente, RStudio te permite crear aplicaciones shinny y observar el resultado rápidamente. La
siguiente figura muestra un ejemplo:
También podemos ver un ejemplo de los archivos RMarkdown, que permite editar textos y ver los resultados de
nuestro código R en distintos formatos, por ejemplo en pdf, word o html.
Figura 7. RMarkdown, para dar formato al texto.
El signo > (command prompt) en la consola indica que el sistema está a la espera de que el usuario realize alguna
entrada. Si queremos obtener el cociente de dividir 1 entre 3, basta con escribir:
1/3
## [1] 0.3333333
Para hacer un comentario que no se ejecute en R, utilizamos el símbolo almohadilla. Este nos sirve, por ejemplo, para
describir las distintas etapas de trabajo dentro código:
## [1] 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5
Podemos utilizar las flechas verticales del teclado en la consola de R para recorrer el historial de ordenes, mientras
que las flechas horizontales permiten el movimiento dentro de la línea.
El operador de asignación < − o el de igualdad = permiten crear objetos en R. El nombre de un objeto debe
comenzar con una letra (A-Z y a-z), y puede incluir dígitos (0-9) y puntos (.). R discrimina entre letras mayúsculas y
minúsculas para el nombre de un objeto, de tal manera que x y X se refiere a objetos diferentes. R no interpreta los
espacios excepto para la asignación. Por ejemplo, para crear el objeto x1 con los siguientes elementos 1,2,3,4,5
podemos marcar cualquiera de las siguientes opciones:
x1<-1:5
1:5->x1
x1=1:5
Para observar los objetos creados en nuestra área de trabajo podemos escribir la función ls() (es la abreviación de list
) u objects().
ls()
objects()
Si queremos borrar objetos de la memoria podemos escribir rm(x1), mientras que si queremos eliminar todos los
objetos del área de trabajo, escribiremos rm(list = ls()).
rm(x1)
La función save nos permite guardar los objetos en un nuevo archivo RData. Podemos seleccionar específicamente
qué archivos guardar y el nombre del archivo que queremos crear o simplemente guardar todo lo que se encuentre en
nuesta área de trabajo.
Vayamos a la carpeta de trabajo y observemos que se han creado dos archivos de extensión RData.
Si quisiéramos acceder posteriormente a estos objetos, basta con utilizar la función load, con el nombre del archivo (y
la ruta donde se encuentra).
Si lo que queremos guardar es el historial de órdenes que hemos ejecutado en R, utilizaremos la función savehistory,
y loadhistory para cargar este archivo en R.
Para salir de R podemos utilizar el comando q(), donde nos preguntará si queremos guardar el workspace (también
podemos utilizar q(save = no)).
Antes de comenzar a trabajar en R conviene observar nuestro directorio de trabajo, es decir, aquella carpeta donde
guardaremos nuestros resultados. Para observar en qué carpeta estamos trabajando utilizaremos la función getwd,
mientras que para cambiar o seleccionar un nuevo directorio utilizaremos la función setwd.
# Para seleccionar el directorio en Mac se utiliza una única barra "/", mientras que en Windows se utilizan
barras dobles "//" o simple pero con inclinación opuesta "\". Sin embargo, es mejor utilizar las dobles
barras debido a que R interpreta "\" como un caracter de salida.
setwd("~/Desktop/maxima/curso R/TEMAS/tema1")
# opciones actuales
options()
Ser ordenado.
Se recomienda crear una carpeta para cada nuevo análisis, donde subdividir las áreas en:
1. data
2. script
3. figures
4. workspace
R consta de un sistema base (vienen con la instalación del programa) y un sistema adicional (deben ser instalados
por el usuario) de paquetes, que extienden las funciones del programa. Los paquetes son una colección de funciones
programadas previamente sobre temas específicos.
Para instalar un paquete adicional en R, tenemos dos opciones:
1) podemos ir a la ventana que se encuentra debajo a la derecha y pinchar en la pestaña de “Packages”, luego en
“Install” y buscar en el repositorio CRAN (Comprehensive R Archive Network) de R el paquete que deseamos o
primero descargarlo y luego buscar el archivo comprimido del paquete en nuestro directorio; y
Si no usas RStudio, R te pedirá que especifiques un mirror para la descarga. Es decir, tienes que elegir un servidor
que se encuentre cerca de tu localidad para comenzar la descarga. Si usas RStudio y quieres elegir el servidor,
puedes ir a “Tools” y luego a “Options”, para seleccionar el que más te interese.
Finalmente, para cualquiera de los dos procedimientos de descarga, los paquetes deben ser cargados o activados (
loading) para volverlos disponibles por el programa; esto se realiza desde la barra de herramientas con Paquetes,
Cargar paquete o desde la consola con la función library. Hay que:
Si queremos desactivar un paquete (por ejemplo, porque sus funciones tienen el mismo nombre que otras ya
activadas y nos genera tener que especificar el paquete que queremos utilizar), podemos utilizar la función .
detach(package:vegan)
Para actualizar las últimas versiones de un paquete podemos utilizar la función o en la pestaña de Packages
presionar en “Updates”.
3. Operaciones básicas
Este capítulo te permite conocer qué utilidades tiene R. A modo de resumen, podemos utilizar R como una
calculadora para operaciones aritméticas y funciones matemáticas o podemos querer ir más allá y aprender el
lenguaje de R.
Esta última opción es sin dudas la más interesante, por ello, primero te enseñaremos las reglas básicas de sintaxis
para que puedas elaborar tus propios códigos y luego ahondaremos en los pilares de R: los objetos.
Entonces, si queremos utilizar R para cálculos matemáticos simples, basta con escribir:
## [1] 5
2 - 3 # resta
## [1] -1
2*3 # multiplicación
## [1] 6
2/3 # división
## [1] 0.6666667
2^3 # potenciación
## [1] 8
Hay que tener en cuenta que R utiliza la precedencia en las operaciones, esto quiere decir que primero se realizan las
funciones exponenciales, luego la multiplicación y división según el orden de los operadores que hayan (paréntesis) y
finalmente las sumas y restas también en el orden en el que estén presentes. Aquí tienen algunos ejemplos:
## [1] 10
(4^2) - (3*2)
## [1] 10
1 - 6 + 4
## [1] -1
(1 - 6) + 4
## [1] -1
2^-3
## [1] 0.125
2^(-3)
## [1] 0.125
Si queremos realizar cálculos con vectores, lo primero es construir los vectores (en este caso x e y) y luego aplicar las
herramientas aritméticas.
x<-1:3
y<-2:4
+ x
- x
x + y
x - y
x * y
x / y
x ^ y
x ** y
x %% y
x %/% y
Por ejemplo:
exp(3) #exponencial
## [1] 20.08554
## [1] 1.414214
log(1) # logaritmo
## [1] 0
## [1] 0.841471
## [1] 0.5403023
## [1] 1.557408
max(1:3) #máximo
## [1] 3
min(1:3) #mínimo
## [1] 1
## [1] 1 3
mean(1:3) #media
## [1] 2
sum(1:3) #suma
## [1] 6
## [1] 1 1
## [1] 1 3 6
## [1] 1
quantile(1:3) # cuantiles
R decide automáticamente cuando utilizar notación científica. Los siguientes ejemplos enseñan cómo se representan
números muy pequeños o muy grandes. Si utilizamos notación científica, el número 0, 000172 se debe escribir como
1, 72x10 − 4, y en R se escribe 1.72e − 4. A su vez, el número 11131, se escribe en notación científica 1, 33x10 4, y en
R se escribe 1.33e4.
1.72e-4
## [1] 0.000172
1.33e4
## [1] 13300
Si queremos especificar el número de cifras significativas que queremos observar, basta con escribir:
signif(0.1723,digits=2)
## [1] 0.17
Recordemos que los ceros a la izquierda del punto no son cifras significativas.
También tenemos la posibilidad de redondear una cifra, solo tenemos que especificar el número de cifras (o dígitos)
que queremos obtener. Por ejemplo:
round(1.12345,digits=2)
## [1] 1.12
round(1.12534,digits=2)
## [1] 1.13
Aprende Practicando...
Operadodes de sintaxis
Nuevamente mediante la función help podemos acceder al listado de todos los operadores de sintaxis.
# R utiliza operadores unitarios y binarios, para obtener el listado de ellos escribe:
help(Syntax)
## [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4
## [18] 5.1 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5
## [35] 4.9 5.0 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0
## [52] 6.4 6.9 5.5 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8
## [69] 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4
## [86] 6.0 6.7 6.3 5.6 5.5 5.5 6.1 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8
## [103] 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7
## [120] 6.0 6.9 5.6 7.7 6.3 6.7 7.2 6.2 6.1 6.4 7.2 7.4 7.9 6.4 6.3 6.1 7.7
## [137] 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8 6.7 6.7 6.3 6.5 6.2 5.9
head(iris[,1]) #lo mismo que en el paso anterior pero ahora llamamos por el número de columna, no por su
nombre
iris[1:2,1:2] # enseña las dos primeras filas y las dos primeras columnas
## Sepal.Length Sepal.Width
## 1 5.1 3.5
## 2 4.9 3.0
## [1] 1 NA 3 4 5
# : generador de secuencia.
1:6
## [1] 1 2 3 4 5 6
help(Comparison)
help(Logic)
u<-c(3,6,NA,1)
u[u<2] # retiene aquellos valores de u que son menores que 2
## [1] NA 1
## [1] 3 6 1
## [1] FALSE
v<-c(1,6,3)
v>5 #qué valores de v son mayores que 5?
## [1] 2
w<-c(2,1,1)
v<w #qué valores de v son menores que w, elemento a elemento?
z<-v<w
which(z) #cuáles cumplen la orden z?
## [1] 1
Vector
Un vector es una colección ordenada de elementos del mismo tipo.
Podemos crear un vector de distintas maneras. Por ejemplo, utilizando el operador de concatenación c:
x<-c(1,2,3) #números
x
## [1] 1 2 3
y<-c("a","b","c") #caracteres
y
## [1] TRUE
is.vector(y)
## [1] TRUE
is.vector(z)
## [1] TRUE
Matrices
Son generalizaciones multidimensionales del vector, con elementos del mismo tipo. Es decir, están formados por
varias columnas (o filas) de vectores. Para crear una matriz en R solo tienes que utilizar la función matrix con los
valores que queramos agregar y el número de columnas o filas que queremos generar. Además puedes especificar
cómo quieres que se rellene la matriz, si con los valores agregados por filas o columnas (argumento
byrow = T RUE o FALSE ).
Ejemplo:
## [1] 4
Las funciones rownames y colnames nos permiten agregarles nombres a las filas y columnas, respectivamente.
En la figura 12 puedes observar un listado de operaciones que podemos realizar con las matrices.
Array
También son generalizaciones multidimensionales del vector, con elementos de un solo tipo. Un vector tiene una
dimensión(o ninguna según R), una matriz tiene dos dimensiones, y un array tiene dos o más dimensiones.
(a<-array(1:24, dim=c(2,3,4)))
## , , 1
##
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
##
## , , 2
##
## [,1] [,2] [,3]
## [1,] 7 9 11
## [2,] 8 10 12
##
## , , 3
##
## [,1] [,2] [,3]
## [1,] 13 15 17
## [2,] 14 16 18
##
## , , 4
##
## [,1] [,2] [,3]
## [1,] 19 21 23
## [2,] 20 22 24
## [1] 15
# utilizamos la opción drop para ver las dimensiones reales de lo que le pedimos a R.
a[,2,3, drop=FALSE] #columna 2, tabla 3
## , , 1
##
## [,1]
## [1,] 15
## [2,] 16
a[,2,3]
## [1] 15 16
## [1] TRUE
Por ejemplo:
data<-data.frame(ID=c("gen0","genB","genZ"),
subj1=c(10,25,33),
subj2=c(NA,34,15),
oncogen=c(TRUE,TRUE,FALSE),
loc=c(1,30,125))
data
#transformando una matriz. Todos los valores son del mismo tipo.
y=matrix(1:9,ncol=3)
y
as.data.frame(y)
## V1 V2 V3
## 1 1 4 7
## 2 2 5 8
## 3 3 6 9
## y z x
## 1 a TRUE 0.6442188
## 2 b FALSE 0.3191041
## 3 c TRUE 0.7681431
## 4 d FALSE 0.7122142
## 5 e FALSE 0.6615698
## 6 f TRUE 0.8615854
## 7 g TRUE 0.7786770
## 8 h FALSE 0.2479793
## 9 i FALSE 0.2790006
## 10 j TRUE 0.1275188
#NOTA: R transforma los vectores de tipo caracter en factor cuando construye un data frame. Para evitarlo
debes utilizar el argumento stringsAsFactors.
str(new)
new2=data.frame(y,z,x, stringsAsFactors=FALSE)
str(new2)
Factor
Es un tipo de vector para datos cualitativos (o categóricos). Las variables cuantitativas se representan en R mediante
un vector, mientras que para las variables cualitativas se utilizan factores.
Por ejemplo:
x<-factor(c(1,2,2,1,1,2,1,2,1))
x
## [1] 1 2 2 1 1 2 1 2 1
## Levels: 1 2
factor(c("A", "B"))
## [1] A B
## Levels: A B
Cuando necesitamos convertir los factores en texto o en números utilizamos las funciones as.character y as.numeric,
respectivamente.
(spain<-c("Madrid", "Barcelona"))
(spain.f<-factor(spain))
as.character(spain.f)
as.numeric(spain.f)
## [1] 2 1
Si queremos construir un factor ordenado, por ejemplo para representar una variable ordinal, tenemos que especificar
la opción ordered.
res.examen<-c("Bajo","Medio","Bajo","Alto","Medio")
factor(res.examen, levels=c("Bajo","Medio", "Alto"), ordered=TRUE)
List
Es un vector generalizado, es decir, sus componentes pueden ser también listas, o pueden ser de distinto tipo. No
tienen estructura.
Las listas son muy útiles cuando queremos agrupar distintos tipos de objetos y de distinto tamaño.
Por ejemplo:
(y<-list(1:3,"A"))
## [[1]]
## [1] 1 2 3
##
## [[2]]
## [1] "A"
## [[1]]
## [1] 1 2 3
## [1] "A"
## $primero
## [1] 1 2 3
z[["primero"]]
## [1] 1 2 3
z$primero
## [1] 1 2 3
z$segundo
## [1] "A"
#cambiamos elementos
z[[2]]<-"B"
z
## $primero
## [1] 1 2 3
##
## $segundo
## [1] "B"
#combinamos
c(y,z)
## [[1]]
## [1] 1 2 3
##
## [[2]]
## [1] "A"
##
## $primero
## [1] 1 2 3
##
## $segundo
## [1] "B"
#eliminamos elementos
z$segundo<-NULL
Funciones código
Para escribir nuestra propia función en R, basta con seguir la siguiente sintaxis: function_name<-function(argument)
statment. Con la palabra function definimos la función, entre paréntesis especificamos los argumentos, mientras que
entre corchetes escribimos el cuerpo de la función (las órdenes a ejecutar).
Por ejemplo:
#creamos una función que ha de devolver siempre el doble de aquel elemento que le demos.
f1<-function(x){2*x}
## [1] 2 4 6 8 10 12 14 16 18 20
## [1] TRUE
Otros ejemplos:
#creamos una función que aplica la relación A*B/C y devuelve el objeto formado.
funcion1<-function(A,B,C){x1<-A*B/C; x1}
## function (A, B, C)
## NULL
## [1] 0.6666667
La función siempre retorna la última expresión evaluada. Si se quiere obtener otra expresión, se puede utilizar la
función return o print, que escriben el valor de una variable.
check(1)
## [1] "Positive"
check(-10)
## [1] "Negative"
check(0)
## [1] "Zero"
check(1)
## [1] "Positive"
check(-10)
## [1] "Negative"
check(0)
## [1] "Zero"
También podemos utilizar la función cat, que tiene mayor versatilidad. Por ejemplo:
x<-2
cat(x)
cat("María")
# abre una página html con funciones o paquetes donde aparece la palabra "median"
help.search("median")
4.2 Viñetas
Como hemos mencionado anteriormente, R consta de un sistema base de paquetes y un conjunto adicional de
paquetes que extienden su funcionalidad.
Además, puedes acceder a información sobre los paquetes utilizando la función vignette:
4.3 Citar R
##
## To cite R in publications use:
##
## R Core Team (2015). R: A language and environment for
## statistical computing. R Foundation for Statistical Computing,
## Vienna, Austria. URL http://www.R-project.org/.
##
## A BibTeX entry for LaTeX users is
##
## @Manual{,
## title = {R: A Language and Environment for Statistical Computing},
## author = {{R Core Team}},
## organization = {R Foundation for Statistical Computing},
## address = {Vienna, Austria},
## year = {2015},
## url = {http://www.R-project.org/},
## }
##
## We have invested a lot of time and effort in creating R, please
## cite it when using it for data analysis. See also
## 'citation("pkgname")' for citing R packages.
##
## To cite package 'vegan' in publications use:
##
## Jari Oksanen, F. Guillaume Blanchet, Roeland Kindt, Pierre
## Legendre, Peter R. Minchin, R. B. O'Hara, Gavin L. Simpson,
## Peter Solymos, M. Henry H. Stevens and Helene Wagner (2015).
## vegan: Community Ecology Package. R package version 2.3-2.
## http://CRAN.R-project.org/package=vegan
##
## A BibTeX entry for LaTeX users is
##
## @Manual{,
## title = {vegan: Community Ecology Package},
## author = {Jari Oksanen and F. Guillaume Blanchet and Roeland Kindt and Pierre Legendre and Peter R.
Minchin and R. B. O'Hara and Gavin L. Simpson and Peter Solymos and M. Henry H. Stevens and Helene Wagner},
## year = {2015},
## note = {R package version 2.3-2},
## url = {http://CRAN.R-project.org/package=vegan},
## }
##
## ATTENTION: This citation information has been auto-generated from
## the package DESCRIPTION file and may need manual editing, see
## 'help("citation")'.
4.4 Referencias
Michael J. Crawley. 2007. The R Book. John Wiley & Sons Ltd.
Michael J. Crawley. 2005. Statistics: An Introduction using R. Wiley. ISBN 0 470 02297 3.
John Verzani. 2005. Using R for Introductory Statistics. Chapman & Hall CRC, Boca Raton, FL, ISBN 1 584
88450 9. aquí.
Emmanuel Paradis. 2002. R for Beguinners. aquí.
En español:
R para Principiantes, la versión en español de R for Beginners, traducido por Jorge A. Ahumada (PDF).
Versión en español de An Introduction to R por Andrés González y Silvia González (PDF).
Estadística Básica con R y R-Commander. aquí.
Introducción a R y R-Commander. aquí.
Gráficos Estadísticos con R por Juan Carlos Correa y Nelfi González.
Cartas sobre Estadística de la Revista Argentina de Bioingeniería por Marcelo R. Risk.
Introducción al uso y programación del sistema estadístico R por Ramón Díaz-Uriarte, transparencias
preparadas para un curso de 16 horas sobre R, dirigido principalmente a biólogos y especialistas en
bioinformática.
Lista de correo R-help-es en español. Lista de correo oficial de R en español.
Cuando cometemos un error en el código, R nos indica un mensaje o advertencia que, si se presta atención, nos da
información muy útil acerca de cómo solucionar el problema. ¡De los errores se aprende!
5. Manipulación de datos en R
Para leer datos desde un fichero podemos utilizar la función read.table que lee datos separados por espacios en
blanco, tabuladores o saltos de línea. Para exportar datos la función básica es write.table(). Veamos cómo trabajar
con estas funciones:
## a b c
## 1 1 hola 3.141593
## 2 2 hola 3.141593
## 3 3 hola 3.141593
## 4 4 hola 3.141593
## 5 5 hola 3.141593
read.csv("foo.csv")
## a b c
## 1 1 hola 3.141593
## 2 2 hola 3.141593
## 3 3 hola 3.141593
## 4 4 hola 3.141593
## 5 5 hola 3.141593
read.table("foo.txt", header=TRUE)
## a b c
## 1 1 hola 3.141593
## 2 2 hola 3.141593
## 3 3 hola 3.141593
## 4 4 hola 3.141593
## 5 5 hola 3.141593
#En el caso de que los decimales estén determinados por una coma, debemos especificarlo en R, ya que R lee
los decimales con puntos.
Hay que recordar que si trabajas con RStudio tienes la opción de leer datos csv o txt fácilmente desde la barra de
herramientas.
Como ya hemos mencionado, si queremos guardar o leer datos en formato de R software utilizaremos las funciones
save y load.
Como hemos mencionado anteriormente, si queremos utilizar bases de datos incluidos en las librerías, basta con
escribir:
data(ToothGrowth)
head(ToothGrowth)
1.Desde Excel
Para leer archivos xlsx, es decir aquellas versiones de archivo posterior a Excel 2007, podemos utilizar el paquete
xlsx o el paquete gdata.
library(xlsx)
# si queremos leer una hoja específica del documento, utilizamos la opción "1" o sheetName"
mydata <- read.xlsx("c:/myexcel.xlsx", 1)
mydata <- read.xlsx("c:/myexcel.xlsx", sheetName = "mysheet")
#más rápido pero tenemos que definir manualmente las clases de las columnas
mydata <- read.xlsx2("c:/myexcel.xlsx", sheetName = "mysheet")
data = read.xlsx2("myfile.xlsx", 1,
colClasses = c(rep("character", 2), rep("numeric", 3))
library(gdata)
read.xls("mydata.xlsx",sheet=1,header=TRUE)
read.xls("mydata.xls")
data01<- read.table(url("http://personality-
project.org/r/datasets/maps.mixx.epi.bfi.data"),dec=",",header=T)
head(data01)
4.Datos desde otros programas estadísticos (e.g. Minitab, S PLUS, SAS, SPSS, Stata, Systat, etc.).
También podemos escribir información en R que pueda ser leída por otros programas estadísticos, acceder a una
base de datos.
library(foreign)
write.foreign(df, datafile, codefile, package = c(SPSS, Stata, SAS), ...)
Desde SPSS
Hay que guardar el conjunto de datos de SPSS en formato transportable por y luego:
library(Hmisc)
mydata <- spss.get("c:/mydata.por")
library(foreign)
read.spss("mydata")
write.foreign(mydata, "c:/mydata.txt", "c:/mydata.sps", package="SPSS")
Desde SAS
Hay que guardar el conjunto de datos de SAS en formato transportable xpt y luego:
library(Hmisc)
mydata <- sasxport.get("c:/mydata.xpt")
library(foreign)
read.xport("mydata")
write.foreign(mydata, "c:/mydata.txt", "c:/mydata.sas", package="SAS")
Desde Stata
library(foreign)
mydata <- read.dta("c:/mydata.dta")
write.dta(mydata, "c:/mydata.dta")
Estructura
str(x)
Atributos
Ejemplo:
## $dim
## [1] 3 2
##
## $dimnames
## $dimnames[[1]]
## NULL
##
## $dimnames[[2]]
## [1] "a" "pi"
# dimensión 3x2, que no tiene nombres en las filas (dimnames[[1]]) y que si tiene nombres en las columnas
(dimnames[[2]]).
x<-1:15
y<-matrix(5,3,4)
z<-c(TRUE, FALSE)
attributes(x)
## NULL
attributes(y)
## $dim
## [1] 3 4
attributes(z)
## NULL
w<-list(a=1:3,b=5)
attributes(w)
## $names
## [1] "a" "b"
f1<-function(x) {return(2*x)}
attributes(f1)
## $srcref
## function(x) {return(2*x)}
is.function(f1)
## [1] TRUE
Modo (mode).
Lógico (TRUE o FALSE), entero (discretos), real (continuo), carácter (nombre), etc.
Ejemplo:
x<-1:15
y<-matrix(5,3,4)
z<-c(TRUE, FALSE)
mode(x)
## [1] "numeric"
mode(y)
## [1] "numeric"
mode(z)
## [1] "logical"
Tipo (type).
Un objeto puede ser almacenado bajo diferentes formas. Los tipos de objetos más comunes son los objetos dobles,
enteros, complejos, lógicos, carácter y listas.
Doble (double).
R selecciona por defecto datos de tipo doble para representar números. Los datos de este tipo son valores
numéricos continuos. Para verificar si un determinado dato es doble la instrucción a emplear sería is double.
x <- 10
is.double(x)
## [1] TRUE
y <- "a"
is.double(y)
## [1] FALSE
Enteros (Integer).
Se trata de variables numéricas de naturaleza no continua (ej. número de hijos). Para definir un valor numérico
como entero habría que recurrir a la función as integer.
Complejos (complex).
Aunque R reconoce los números complejos este tipo de formato no se utiliza apenas en el análisis de datos.
Lógicos (logical).
Los datos de tipo lógico sólo contienen dos valores FALSE (falso) y TRUE (verdadero). Son generados por R
tras evaluar expresiones lógicas.
Ejemplo:
x1<-1:5
x2<-c(1,2,3,4,5)
x3<-"patata"
typeof(x1)
## [1] "integer"
typeof(x2)
## [1] "double"
typeof(x3)
## [1] "character"
Nombres (names).
Son Etiquetas. Poner un nombre en minúscula no es lo mismo que ponerlo en mayúscula (R es case-sensitive: x ! = X
). Hay nombres reservados, por lo que hay que evitarlos (ej: function, if).
Ejemplo:
z <-list(a=1,b=c,c=1:3)
names(z)
Dimensiones (dim).
Refiere al número de filas y columnas (puede ser cero).
Ejemplo:
x=matrix(1:6,2)
length(x) #largo o tamaño muestral
## [1] 6
## [1] 2 3
Clase (class).
Lista de las clases del objeto (vector alfa-numérico)
Ejemplo:
x <- 10
class(x) # numeric
## [1] "numeric"
Valores perdidos NA (not available), NaN (not a number), Inf (infinite).
Los vectores pueden tomar alguno de los siguientes valores especiales: 1) NA significa “valor no disponible” (“not
available”), 2) NaN significa “valor no numérico” (“not a number”), y 3) Inf significa “valor no finito” (“infinite”). Las
funciones is. na, is. nan e is. infinite detectan qué elemento de un vector son NA, NaN o Inf, respectivamente.
Ejemplo:
x<-c(1:3,NA)
x
## [1] 1 2 3 NA
x+3
## [1] 4 5 6 NA
## [1] 4
## [1] 1 2 3
## [1] FALSE
## [1] TRUE
## [1] TRUE
Cuando utilizamos operaciones sobre vectores con valores ausentes, el resultado será NA a no ser que
especifiquemos que no los considere en los cálculos. Por ejemplo:
## [1] 1 2 3 0
max(x)
## [1] 3
## [1] 1.5
También tenemos las funciones na. omit y na. exclude para omitir o exluir los valores. Las diferencias entre ambas
funciones se pueden ver en funciones de predicción o en obtención de residuales.
y<-matrix(c(1,2,3,NA,4,NA),nrow=3)
y
## [,1] [,2]
## [1,] 1 NA
## [2,] 2 4
## [3,] 3 NA
## [1] 1 2 3 0
na.exclude(x)
## [1] 1 2 3 0
#valores ajustados
fitted(model.omit)
## 4 5 6 7 8
## 5.451807 6.506024 5.240964 6.295181 6.506024
fitted(model.exclude)
## 1 2 3 4 5 6 7 8
## NA NA NA 5.451807 6.506024 5.240964 6.295181 6.506024
#residuales
resid(model.omit)
## 4 5 6 7 8
## 4.548193 1.493976 -4.240964 2.704819 -4.506024
resid(model.exclude)
## 1 2 3 4 5 6 7
## NA NA NA 4.548193 1.493976 -4.240964 2.704819
## 8
## -4.506024
EJERCICIOS:
1.Sea x = c(0, 4, NA, NaN, Inf), aplica las siguientes operaciones y describe el resultado: 1/x x − x 1/x − (x − x)
is. na(x) *is. nan(x)
2.Prueba las siguientes operaciones: 5/0; − 5/0; 0/0 is. na(5/0); is. infinite( − 5/0); is. nan(0/0)
Podemos tomar vectores, matrices o data frames y combinarlos mediante filas ( para igual número de columnas) o
columnas ( para igual número de filas).
rbind(1:5,1:10)
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 1 2 3 4 5 1 2 3 4 5
## [2,] 1 2 3 4 5 6 7 8 9 10
cbind(1:5,1:10)
## [,1] [,2]
## [1,] 1 1
## [2,] 2 2
## [3,] 3 3
## [4,] 4 4
## [5,] 5 5
## [6,] 1 6
## [7,] 2 7
## [8,] 3 8
## [9,] 4 9
## [10,] 5 10
Podemos utilizar la función para combinar data frames basados el columnas o filas comunes (los datos no necesitan
tener las mismas dimensiones). Esta función identifica columnas o filas que son comunes entre los dos data frame
para unirlas. Los argumentos a ingresar son e los data frame, los nombres de las columnas comunes a ambos
conjuntos de datos, especifican el tipo de unión a realizar (Figura 16).
Crearemos unos datos ficticios para ejemplificar la función. Tenemos una base de datos con los productos que han
comprado nuestros clientes y otra base de datos con el estado donde se han comprado dichos productos. Queremos
unir las bases de datos.
## CustomerId Product
## 1 1 Toaster
## 2 2 Toaster
## 3 3 Toaster
## 4 4 Radio
## 5 5 Radio
## 6 6 Radio
## CustomerId State
## 1 2 Alabama
## 2 4 Alabama
## 3 6 Ohio
merge(df1, df2)
## CustomerId Product State
## 1 2 Toaster Alabama
## 2 4 Radio Alabama
## 3 6 Radio Ohio
#merge
x <- data.frame(k1 = c(NA,NA,3,4,5), k2 = c(1,NA,NA,4,5),
data = 1:5)
x
## k1 k2 data
## 1 NA 1 1
## 2 NA NA 2
## 3 3 NA 3
## 4 4 4 4
## 5 5 5 5
## k1 k2 data
## 1 NA NA 1
## 2 2 NA 2
## 3 NA 3 3
## 4 4 4 4
## 5 5 5 5
## k1 k2 data.x data.y
## 1 4 4 4 4
## 2 5 5 5 5
## 3 NA NA 2 1
Dividir en grupos Todas estas funciones nos sirven para dividir una base de datos en función de determinadas
condiciones.
La función stack une (o apila) múltiples vectores en un único vector, mientras que la función unstack es invierte esta
operación.
Considere el siguiente ejemplo donde tenemos los resultados de un experimento donde se comparan los rendimientos
(masa seca por planta) obtenidos bajo 3 condiciones: control y dos diferentes tratamientos. Queremos dar otro
formato a los datos.
require(stats)
head(PlantGrowth)
## weight group
## 1 4.17 ctrl
## 2 5.58 ctrl
## 3 5.18 ctrl
## 4 6.11 ctrl
## 5 4.50 ctrl
## 6 4.61 ctrl
## weight ~ group
## values ind
## 1 4.17 ctrl
## 2 5.58 ctrl
## 3 5.18 ctrl
## 4 6.11 ctrl
## 5 4.50 ctrl
## 6 4.61 ctrl
## 7 5.17 ctrl
## 8 4.53 ctrl
## 9 5.33 ctrl
## 10 5.14 ctrl
## 11 4.81 trt1
## 12 4.17 trt1
## 13 4.41 trt1
## 14 3.59 trt1
## 15 5.87 trt1
## 16 3.83 trt1
## 17 6.03 trt1
## 18 4.89 trt1
## 19 4.32 trt1
## 20 4.69 trt1
## 21 6.31 trt2
## 22 5.12 trt2
## 23 5.54 trt2
## 24 5.50 trt2
## 25 5.37 trt2
## 26 5.29 trt2
## 27 4.92 trt2
## 28 6.15 trt2
## 29 5.80 trt2
## 30 5.26 trt2
## values ind
## 1 4.81 trt1
## 2 4.17 trt1
## 3 4.41 trt1
## 4 3.59 trt1
## 5 5.87 trt1
## 6 3.83 trt1
## 7 6.03 trt1
## 8 4.89 trt1
## 9 4.32 trt1
## 10 4.69 trt1
## 11 6.31 trt2
## 12 5.12 trt2
## 13 5.54 trt2
## 14 5.50 trt2
## 15 5.37 trt2
## 16 5.29 trt2
## 17 4.92 trt2
## 18 6.15 trt2
## 19 5.80 trt2
## 20 5.26 trt2
Cuando queremos tomar un subgrupo de vectores, matrices o data frame según una condición establecida, podemos
utilizar la función subset.
## weight group
## 3 5.18 ctrl
## 7 5.17 ctrl
## 10 5.14 ctrl
## 22 5.12 trt2
subset(PlantGrowth, group=="trt1")
## weight group
## 11 4.81 trt1
## 12 4.17 trt1
## 13 4.41 trt1
## 14 3.59 trt1
## 15 5.87 trt1
## 16 3.83 trt1
## 17 6.03 trt1
## 18 4.89 trt1
## 19 4.32 trt1
## 20 4.69 trt1
Cuando deseamos dividir una base de datos según los grupos definidos en , podemos utilizar la función split.
split(PlantGrowth$weight, f=PlantGrowth$group)
## $ctrl
## [1] 4.17 5.58 5.18 6.11 4.50 4.61 5.17 4.53 5.33 5.14
##
## $trt1
## [1] 4.81 4.17 4.41 3.59 5.87 3.83 6.03 4.89 4.32 4.69
##
## $trt2
## [1] 6.31 5.12 5.54 5.50 5.37 5.29 4.92 6.15 5.80 5.26
cut(PlantGrowth$weight,breaks=c(3,6,9))
## [1] (3,6] (3,6] (3,6] (6,9] (3,6] (3,6] (3,6] (3,6] (3,6] (3,6] (3,6]
## [12] (3,6] (3,6] (3,6] (3,6] (3,6] (6,9] (3,6] (3,6] (3,6] (6,9] (3,6]
## [23] (3,6] (3,6] (3,6] (3,6] (3,6] (6,9] (3,6] (3,6]
## Levels: (3,6] (6,9]
Con estas funciones cambiamos el formato de los datos (filas y columnas) seleccionando cómo queremos que estén
organizados.
Distintas funciones en R requieren que ingresemos los datos en formatos distintos, por ello aquí veremos algunas
funciones que nos permiten transformar los datos de manera rápida.
Como ejemplo utlizaremos los datos de farmacocinética (absorción, eliminación y circulación enterohepática) de la
indometacina, un antiflamatorio no esteroideo. A 6 sujetos se le inyectó indometacina intravenosa y se registró el
momento en el que se tomó la muestra de sangre y la concentración en plasma de indometacina.
La función intercambia los formatos de wide a long y viceversa. Hay que especificar , donde es el data frame a
ingresar, son las variables en el formato wide que correspoden a la única variable del formato long, son las variables
en el formato long que corresponden a múltiples variables en el formato wide, es la variable en el formato long que
diferencia múltiples valores para el mismo grupo o individuo e son las variables en el formato long que identifican
múltiples valores en el mismo grupo/individuo. Pero será más fácil entenderlo con un ejemplo…
head(Indometh)
La figura 18 nos indica ejemplos del uso de las funciones melt y cast.
La función también permite fundir una base de datos de tal modo de obtener una única combinación id-variable por
fila. El argumento define la columna de identificación de los sujetos, pero también puede incorporar variables entre-
sujetos además de las variables de medidas repetidas, define las variables tratamiento que irán en una sola columna
(si se deja en blanco se toman por defecto todas las variables que no sean id).
La función realiza la operación inversa (long->wide), donde los datos son agrupados según la función que se
especifique.
Utilizaremos los datos de calidad de aire en la ciudad de Nueva York desde mayo a setiembre de 1973.
library(reshape)
head(airquality)
#melt
head(melt(airquality))
## Using as id variables
## variable value
## 1 Ozone 41
## 2 Ozone 36
## 3 Ozone 12
## 4 Ozone 18
## 5 Ozone NA
## 6 Ozone 28
#melt
aqm<-melt(airquality, id=c("Month", "Day"))
head(aqm)
#melt
aql <- melt(airquality, id.vars = c("Month", "Day"),
variable.name = "climate_variable",
value.name = "climate_value")
head(aql)
#cast
cast(aqm, Month ~ variable, mean) #con la función mean
Podemos observar los elementos de un objeto utilizando la función str, y con la función o acceder o no acceder a los
elementos que contiene dicho objeto. Por ejemplo, utilizaremos los datos iris (de Fisher o Anderson), que nos dan las
mediciones en centímetros de distintas variables de 50 flores de 3 especies de la familia Iris: Iris setosa, versicolor y
virginica.
# para trabajar con el elemento Sepal.Width de iris, lo llamamos mediante el operador "$"
plot(iris$Sepal.Width)
# o mediante indexación
plot(iris[,"Petal.Width"])
# para activar los elementos de iris, y poder trabajar con ellos sin nombrar a iris
attach(iris)
plot(Sepal.Length)
# para desactivar los elementos de iris
detach(iris)
Una de las grandes ventajas de R es que podemos generar un lenguaje de programación propio. Para ello,
utilizamos comandos escritos entre llaves (expresiones).
Ejemplos:
Para realizar una ejecución condicional utilizamos la siguiente sintaxis: if(expresion1){expresion2}. Es decir, se utiliza
la función if, entre paréntesis se incluye un valor lógico o una expresión que conduce a un valor lógico, y entre
corchetes se incluye el código que se ejecuta cuando el valor lógico anterior es verdadero (TRUE).
También podemos utilizar un código que se ejecute en caso de que el valor lógico no sea verdadero (FALSE); para lo
que cual incluiremos la opción seguido de un código entre corchetes: if(expresion1){expresion2}else{expresion3}.
## [1] 6
## [1] 6
# Función "ifelse"
x
## [1] 4
x<-1:5
ifelse(x == 1, "Yes", "No") # si x es 1 le adjudica Yes, sino No.
y<--1:1
ifelse(y<=0, "no existe", log(y) )
Cuando necesitamos aplicar distintas condiciones, en lugar de utilizar varios if, es de mayor utilidad la función switch.
Aquí el primer argumento es un valor o expresión, y en segundo lugar especificamos las opciones que queremos
tener disponibles. Estas son las opciones:
1. si escribimos switch(i, expresion1, expresion2, …, expresionn), donde i es un número, la función calcula la
expresión i.
2. si escribimos switch(nombreq, nombre1=expresion1, nombre2=expresion2, …, nombren=expresion), donde es
alfanumérico, la función calcula la expresión llamada nombreq.
Por ejemplo:
## [1] "lunes"
## [1] "2"
## [1] 1 2
switch("b", a = 1, b = 2:3)
## [1] 2 3
## [1] 8.3
La función switch solo utiliza valores, no vectores, por lo que si nuestro caso es más complejo, deberemos crear
nuestra propia función con function. Por ejemplo, cuando queremos definir una función que nos permita calcular
distintos tipos de estadísticos de centralidad según lo solicitemos, podemos aplicar:
# si queremos permitir todas las opciones de trim agregamos "..."
centrar <- function(x,type, ...)
{
switch(type, media=mean(x),
mediana = median(x),
recortada = mean(x, ...),
mean(x))
}
## [1] "c"
## [1] "a"
## [1] "d"
## [1] "e"
## [1] "b"
g = 1:10
for( j in 1:length(f)){print(g[j]*2/3)}
## [1] 0.6666667
## [1] 1.333333
## [1] 2
## [1] 2.666667
## [1] 3.333333
## [1] 4
## [1] 4.666667
## [1] 5.333333
## [1] 6
## [1] 6.666667
x<-0
while(length(x)<=10) {x<-c(x,1)}
#crea un objeto x hasta un largo de 10, donde va agregando unos.
x
## [1] 0 1 1 1 1 1 1 1 1 1 1
Es otro tipo de función bucle del tipo repeat{expresion}. La expresión debe tener algún comando de parada (break o
return).
x <- 1
repeat{
print(x)
x = x+1
if (x == 6){
break
}
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
La función break se utiliza dentro de un loop para parar las iteraciones y salir del bucle. La función next finaliza la
iteración actual del bucle y salta a la siguiente sin salir del bucle.
x <- 1:5
for(val in x){
if (val == 3){
next
}
print(val)
}
## [1] 1
## [1] 2
## [1] 4
## [1] 5
aggregate(worms[,c(2,3,5,7)],by=list(veg=Vegetation,d=Damp),"mean")
## Vegetation: Arable
## [1] 5.333333
## --------------------------------------------------------
## Vegetation: Grassland
## [1] 2.444444
## --------------------------------------------------------
## Vegetation: Meadow
## [1] 6.333333
## --------------------------------------------------------
## Vegetation: Orchard
## [1] 9
## --------------------------------------------------------
## Vegetation: Scrub
## [1] 5.25
Las funciones apply, tapply, sapply, lapply, rapply, mapply, se utilizan para aplicar una función específica a cada
columna o fila de un objeto en R. Son generalmente mucho más eficientes que un bucle, más claras y directas.
La orden apply se utiliza para matrices y nos devuelve un vector, array o lista. necesita 3 argumentos apply(x, margin,
function), donde x es la matriz a ingresar, margin indica si aplicaremos la función por filas (1) o columnas (2),
y function es la función a aplicar (e.g. ).
La función lapply siempre devuelve una lista (lapply(list,fun)), la función tapply una tabla (tapply(x,factor,fun)
ingresamos un vector, un factor de agrupación y la función a aplicar), la función vapply trabaja como sapply pero
necesitamos especificar el tipo de valor que queremos obtener (vapply(x,fun,fun.value)) y mapply es la versión
multivariada de sapply (mapply(FUN,…)).
require(stats)
## apply -----------------------------
## creamos una matriz con la que trabajar
x=matrix(1:6,2,3)
x
sum(x)
## [1] 21
## [1] 3 7 11
## sapply ------------------------------
sapply(1:5,sqrt)
## a b c
## 2 4 6
## a b c
## [1,] 1 1 1
## [2,] 2 3 4
## lapply ------------------------------
list<-list(a=c(1,1), b=c(2,2), c=c(3,3))
lapply(list, sum)
## $a
## [1] 2
##
## $b
## [1] 4
##
## $c
## [1] 6
## tapply ----------------------
head(warpbreaks)
## tension
## wool L M H
## A 401 216 221
## B 254 259 169
## vapply -----------------------
vapply(list(i=1:25,j=5,k=5),fivenum,
c("Min."=0,"1stQu."=0,"Median"=0,"3rdQu."=0,"Max."=0))
## i j k
## Min. 1 5 5
## 1stQu. 7 5 5
## Median 13 5 5
## 3rdQu. 19 5 5
## Max. 25 5 5
## mapply -----------------------
list(rep(1,4), rep(2,3),rep(3,2), rep(4,1))
## [[1]]
## [1] 1 1 1 1
##
## [[2]]
## [1] 2 2 2
##
## [[3]]
## [1] 3 3
##
## [[4]]
## [1] 4
## [[1]]
## [1] 1 1 1 1
##
## [[2]]
## [1] 2 2 2
##
## [[3]]
## [1] 3 3
##
## [[4]]
## [1] 4
5.8 Gráficos
Para conocer el potencial de R en la realización de gráficos de alto nivel, puedes escribir la siguiente orden en la
consola:
demo(graphics)
# y también mira
demo(lattice, package = "lattice", ask = TRUE) #debes tener instalado el paquete lattice
El comando más sencillo de R para graficar es la función plot. Los argumentos que podemos seleccionar son: type: “l”
para representar líneas, “b” para representar puntos unidos por líneas , “s” tipo escalera, “h” tipo histograma, “n” sin
linea y “p” para representar puntos (por defecto).
pch: para seleccionar el tipo de punto
lty: selecciona el tipo de línea
lwd: cambia el ancho de la línea
col: color de las líneas
font: fuente del texto
x<-c(-5:5)
y<-x^2
plot(x,y)
# aquí seleccionamos el tipo de línea "both", es decir, con punto y línea (type)
# seleccionamos el tipo de punto 20, que es un círculo relleno (pch)
# la línea es quebrada (lty)
# el color=2 corresponde al rojo
# elegimos un título (main) y un subtítulo (sub)
# también seleccionamos el nombre de los ejes x e y (xlab e ylab)
w<-x+3
plot(y)
points(w,y,type="o",pch=20,lty=2,col=1)
z<-x-2
lines(z,y,type="o",pch=20,lty=2,col=3)
text(0,20,"Texto")
abline(h=10, col="green")
abline(v=6, col="blue")
abline(a=1,b=1,col="red")
Si queremos generar múltiples gráficos en una misma ventana, utilizaremos la función :
Por ejemplo:
x<-1:10
y<-2:11
pdf("grafico_prueba.pdf")
plot(y~x)
dev.off()
## quartz_off_screen
## 2
En el próximo tema veremos más opciones gráficas y especificaremos en qué caso utilizar una u otra. Sin embargo,
es interesante que le des un vistazo al paquete , ya que es una herramienta gráfica muy potente. La función puede
utilizarse para la mayoría de los gráficos habituales.
Una colección de letras o palabras se llama . Si queremos concatenar texto debemos utilizar la función , mientras que
si queremos separarlo utilizaremos . A continuación veremos un ejemplo:
y<-c("Hello","word")
paste(y,collapse=" ")
strsplit(x," ")
## [[1]]
## [1] "Hello" "world"
El argumento especifica cómo se unen (e.g. con un espacio en blanco , sin espacio , mediante una coma ).
tolower(x)
toupper(x)
## [1] "llo"
gsub("e",".", c("El","lunes"))
Si quieres obtener funciones más avanzadas para trabajar con texto, puedes mirar el paquete .
Cuando queremos investigar por qué y dónde se produce un error en la programación, debemos utilizar las funciones:
* , cuando no comprendemos el mensaje de error, esta función nos indica la secuencia de llamadas antes del
problema.
* , cuando queremos parar la ejecución en el punto de error, para continuar examinando la programación. La opción
“n” nos permite continuar el código paso a paso y la opción “Q” es para salir.
* , similar a la función anterior, pero desde el comienzo del código. La opción “Q” se utiliza para salir.
Ejemplo:
# traceback -------------------
#error por el mal uso de una función automática
foo<-function(x){ print(1); bar(2) }
bar<-function(x){x+a.variable}
foo(2) # da un error extraño
traceback() #nos dice cuál es el error
# debug ------------------------------
#revisar paso a paso una función
require(stats)
centre <- function(x, type) { switch(type, mean = mean(x), median = median(x), trimmed = mean(x, trim =
.1)) }
x <- rcauchy(10)
centre(x, "mean")
debug(centre)
centre(x, "mean")
undebug(centre)
5.11 Control de la duración de la operación:
Ejemplo: