Manual de R
Freddy Hernández Olga Usuga
2021-07-26
Gracias a Dios por todo lo que me ha dado.
Índice general
Prefacio VII
Estructura del libro . . . . . . . . . . . . . . . . . . . . . . . . . . . . vii
Información del software y convenciones . . . . . . . . . . . . . . . . . viii
Bloques informativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . viii
Agradecimientos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ix
Sobre los autores XI
Introducción XIII
0.1. Orígenes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii
0.2. Instalación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiv
0.3. Apariencia del programa . . . . . . . . . . . . . . . . . . . . . . . xiv
Tipos de objetos XV
0.4. Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv
0.5. Vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv
0.6. Matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
0.7. Arreglos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix
0.8. Marco de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi
0.9. Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxiv
EJERCICIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvi
Guía de estilo XXIX
0.10. Nombres de los archivos . . . . . . . . . . . . . . . . . . . . . . . xxix
0.11. Nombres de los objetos . . . . . . . . . . . . . . . . . . . . . . . . xxix
0.12. Longitud de una línea de código . . . . . . . . . . . . . . . . . . xxix
0.13. Espacios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxx
0.14. Asignación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxii
0.15. Punto y coma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxii
Ingresando datos a R XXXIII
0.16. Usando la consola . . . . . . . . . . . . . . . . . . . . . . . . . . xxxiii
0.17. Usando ventana emergente con svDialogs . . . . . . . . . . . . . xxxiii
iii
iv ÍNDICE GENERAL
0.18. Botones para responder . . . . . . . . . . . . . . . . . . . . . . . xxxiv
Funciones básicas de R XXXVII
0.19. ¿Qué es una función de R? . . . . . . . . . . . . . . . . . . . . . xxxvii
0.20. Operadores de asignación . . . . . . . . . . . . . . . . . . . . . . xxxviii
0.21. Operaciones básicas . . . . . . . . . . . . . . . . . . . . . . . . . xxxviii
0.22. Pruebas lógicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . xl
0.23. Operadores lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . xlii
0.24. Funciones sobre vectores . . . . . . . . . . . . . . . . . . . . . . . xliv
0.25. Funciones matemáticas . . . . . . . . . . . . . . . . . . . . . . . . xlv
0.26. Función seq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlvii
0.27. Función rep . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xlviii
0.28. Funciones round, ceiling, floor y trunc . . . . . . . . . . . . . l
0.29. Funciones sort y rank . . . . . . . . . . . . . . . . . . . . . . . . li
EJERCICIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . lii
Instrucciones de control LV
0.30. Instrucción if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . lv
0.31. Instrucción if else . . . . . . . . . . . . . . . . . . . . . . . . . lvi
0.32. Instrucción ifelse . . . . . . . . . . . . . . . . . . . . . . . . . . lvi
0.33. Instrucción for . . . . . . . . . . . . . . . . . . . . . . . . . . . . lvii
0.34. Instrucción while . . . . . . . . . . . . . . . . . . . . . . . . . . . lvii
0.35. Instrucción repeat . . . . . . . . . . . . . . . . . . . . . . . . . . lix
Creación de funciones en R LXI
0.36. ¿Qué es una función en R? . . . . . . . . . . . . . . . . . . . . . lxi
0.37. Partes de una función en R . . . . . . . . . . . . . . . . . . . . . lxi
EJERCICIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . lxv
Lectura de bases de datos LXIX
0.38. ¿Qué es una base de datos? . . . . . . . . . . . . . . . . . . . . . lxix
0.39. ¿En qué formato almacenar una base de datos? . . . . . . . . . . lxix
0.40. Función [Link] . . . . . . . . . . . . . . . . . . . . . . . . . lxx
0.41. Lectura de bases de datos en Excel . . . . . . . . . . . . . . . . . lxxiii
EJERCICIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . lxxiv
Tablas de frecuencia LXXVII
0.42. Tabla de contingencia con table . . . . . . . . . . . . . . . . . . lxxvii
0.43. Función [Link] . . . . . . . . . . . . . . . . . . . . . . . . . lxxix
0.44. Función addmargins . . . . . . . . . . . . . . . . . . . . . . . . . lxxx
0.45. Función hist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . lxxxi
EJERCICIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . lxxxv
Medidas de tendencia central LXXXVII
0.46. Media . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . lxxxviii
0.47. Mediana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . lxxxix
0.48. Moda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xc
ÍNDICE GENERAL v
Medidas de variabilidad XCIII
0.49. Rango . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xciv
0.50. Varianza . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xcv
0.51. Desviación estándar . . . . . . . . . . . . . . . . . . . . . . . . . xcviii
0.52. Coeficiente de variación (𝐶𝑉 ) . . . . . . . . . . . . . . . . . . . xcix
Medidas de posición CI
0.53. Cuantiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ci
Medidas de correlación CIII
0.54. Función cor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ciii
EJERCICIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cviii
Distribuciones discretas CIX
0.55. Funciones disponibles para distribuciones discretas . . . . . . . . cix
0.56. Distribuciones discretas generales . . . . . . . . . . . . . . . . . . cxv
Distribuciones continuas CXXI
0.57. Funciones disponibles para distribuciones continuas . . . . . . . . cxxi
0.58. Distribuciones continuas generales . . . . . . . . . . . . . . . . . cxxvi
Verosimilitud CXXXIII
0.59. Función de verosimilitud . . . . . . . . . . . . . . . . . . . . . . . cxxxiii
0.60. Función de log-verosimilitud . . . . . . . . . . . . . . . . . . . . . cxxxiv
0.61. Método de máxima verosimilitud para estimar parámetros . . . . cxxxiv
0.62. Score e Información de Fisher . . . . . . . . . . . . . . . . . . . . cxliv
0.63. Método de máxima verosimilitud para estimar parámetros en mo-
delos de regresión . . . . . . . . . . . . . . . . . . . . . . . . . . . cxlv
EJERCICIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cxlviii
Selección de la distribución CLI
0.64. Función fitDists . . . . . . . . . . . . . . . . . . . . . . . . . . cli
Estudiando la normalidad CLV
0.65. Consideraciones iniciales . . . . . . . . . . . . . . . . . . . . . . . clv
0.66. Histograma y densidad . . . . . . . . . . . . . . . . . . . . . . . . clv
0.67. Gráficos cuantil cuantil . . . . . . . . . . . . . . . . . . . . . . . clix
0.68. Pruebas de normalidad . . . . . . . . . . . . . . . . . . . . . . . . clxv
EJERCICIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . clxviii
Intervalos de confianza CLXIX
0.69. Función [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . clxix
0.70. Función [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . clxxvi
0.71. Función [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . clxxviii
Prueba de hipótesis CLXXXI
0.72. Prueba de hipótesis para 𝜇 de una población normal . . . . . . . clxxxi
vi ÍNDICE GENERAL
0.73. Prueba de hipótesis para 𝜇 con muestras grandes . . . . . . . . . clxxxiii
0.74. Prueba de hipótesis para la proporción 𝑝 . . . . . . . . . . . . . . clxxxiv
0.75. Prueba de hipótesis para la varianza 𝜎2 de una población normal clxxxix
0.76. Prueba de hipótesis para el cociente de varianzas 𝜎12 /𝜎22 . . . . . cxc
0.77. Prueba de hipótesis para la diferencia de medias 𝜇1 − 𝜇2 con
varianzas iguales . . . . . . . . . . . . . . . . . . . . . . . . . . . cxcv
0.78. Prueba de hipótesis para la diferencia de medias 𝜇1 − 𝜇2 con
varianzas diferentes . . . . . . . . . . . . . . . . . . . . . . . . . . cxcvii
0.79. Prueba de hipótesis para la diferencia de proporciones 𝑝1 − 𝑝2 . . cxcix
0.80. Prueba de hipótesis para la diferencia de medias pareadas . . . . cc
Aproximación de integrales CCIII
0.81. Aproximación de Laplace unidimensional . . . . . . . . . . . . . cciii
Curiosidades CCVII
0.82. ¿Cómo verificar si un paquete no está instalado para instalarlo
de forma automática? . . . . . . . . . . . . . . . . . . . . . . . . ccvii
Prefacio
Este libro fue creado con la intención de apoyar el aprendizaje del lenguaje de
programación R en estudiantes de pregrado, especialización, maestría e investi-
gadores, que necesiten realizar análisis estadísticos. En este libro se explica de
una forma sencilla la utilidad de la principales funciones para realizar análisis
estadístico.
Estructura del libro
El libro está estructurado de la siguiente manera.
En el capítulo se presenta una breve introducción sobre el lenguaje de progra-
mación R; en el capítulo 0.3 se explican los tipos de objetos más comunes en
R; en el capítulo 0.9.1 se muestran las normas de estilo sugeridas para escribir
código en R; el capítulo 0.18 presenta las funciones básicas que todo usuario
debe conocer para usar con éxito R; el capítulo 0.35 trata sobre cómo crear
funciones; el capítulo 0.37 muestra como leer bases de datos desde R; en el ca-
pítulo 0.41 se ilustra la forma para construir tablas de frecuencia; en el capítulo
0.45 se muestra como obtener las diversas medidas de tendencial central para
vii
viii ÍNDICE GENERAL
variables cuantitativas, el capítulo 0.48 muestra como calcular las medidas de
variabilidad, en el capítulo 0.52 se ilustra cómo usar las funciones para obtener
medidas de posición; en el capítulo 0.53 se muestra como obtener medidas de
correlación entre pares de variables; en los capítulos 0.54 y 0.56 se tratan los
temas de distribuciones discretas y continuas; en el capítulo 0.58 se aborda el
tema de verosimilitud; en el capítulo 0.80 se muestra el tema de aproximación
de integrales.
Información del software y convenciones
Para realizar este libro se usaron los paquetes de R knitr (Xie, 2015) y book-
down (Xie, 2021), estos paquetes permiten construir todo el libro desde R y
sirven para incluir código que se ejecute de forma automática incluyendo las
salidas y gráficos.
En todo el libro se presentarán códigos que el lector puede copiar y pegar en su
consola de R para obtener los mismos resultados aquí presentados. Los códigos se
destacan en una caja de color beis (o beige) similar a la mostrada a continuación.
4 + 6
a <- c(1, 5, 6)
5 * a
1:10
Los resultados o salidas obtenidos de cualquier código se destacan con dos sím-
bolos de númeral (##) al inicio de cada línea o renglón, esto quiere decir que todo
lo que inicie con ## son resultados obtenidos y el usuario NO los debe copiar.
Abajo se muestran los resultados obtenidos luego de correr el código anterior.
## [1] 10
## [1] 5 25 30
## [1] 1 2 3 4 5 6 7 8 9 10
Bloques informativos
En varias partes del libro usaremos bloques informativos para resaltar algún
aspecto importante. Abajo se encuentra un ejemplo de los bloques y su signifi-
cado.
Nota aclaratoria.
Sugerencia.
ÍNDICE GENERAL ix
Advertencia.
Agradecimientos
Agradecemos enormemente a todos los estudiantes, profesores e investigadores
que han leído este libro y nos han retroalimentado con comentarios valiosos para
mejorar el documento.
Freddy Hernández Barajas
Olga Cecilia Usuga Manco
x ÍNDICE GENERAL
Sobre los autores
Freddy Hernández Barajas es profesor asistente de la Universidad Nacional de
Colombia adscrito a la Escuela de Estadística de la Facultad de Ciencias.
Olga Cecilia Usuga Manco es profesora asociada de la Universidad de Antioquia
adscrita al Departamento de Ingeniería Industrial de la Facultad de Ingeniería.
xi
xii ÍNDICE GENERAL
Introducción
0.1. Orígenes
R es un lenguaje de programación usado para realizar procedimientos estadísti-
cos y gráficos de alto nivel, este lenguaje fue creado en 1993 por los profesores
e investigadores Robert Gentleman y Ross Ihaka. Inicialmente el lenguaje se
usó para apoyar los cursos que tenían a su cargo los profesores, pero luego de
ver la utilidad de la herramienta desarrollada, decidieron colocar copias de R
en StatLib. A partir de 1995 el código fuente de R está disponible bajo licen-
cia GNU GPL para sistemas operativos Windows, Macintosh y distribuciones
Unix/Linux. La comunidad de usuarios de R en el mundo es muy grande y los
usuarios cuentan con diferentes espacios para interactuar, a continuación una
lista no exhaustiva de los sitios más populares relacionados con R:
Rbloggers1 .
Comunidad hispana de R2 .
Nabble3 .
Foro en portugués4 .
Stackoverflow5 .
Cross Validated6 .
R-Help Mailing List7 .
Revolutions8 .
R-statistics blog9 .
RDataMining10 .
En la siguiente figura están Robert Gentleman (izquierda) y Ross Ihaka (dere-
1 [Link]
2 [Link]
3 [Link]
4 [Link]
5 [Link]
6 [Link]
7 [Link]
8 [Link]
9 [Link]
10 [Link]
xiii
xiv INTRODUCCIÓN
cha) creadores de R.
0.2. Instalación
Para realizar la instalación de R usted debe visitar la página del CRAN (Com-
prehensive R Archive Network) disponible en este enlace11 . Una vez ingrese a
la página encontrará un cuadro similar al mostrado en la siguiente figura donde
encontrará los enlaces de la instalación para los sistemas operativos Linux, Mac
y Windows.
Supongamos que se desea instalar R en Windows, para esto se debe dar clic
sobre el hiperenlace Download R for Windows. Una vez hecho esto se abrirá
una página con el contenido mostrado en la siguiente figura. Luego se debe dar
clic sobre el hiperenlace install R for the first time.
Luego de esto se abrirá otra página con un encabezado similar al mostrado en
la siguiente figura. Al momento de capturar la figura la versión actual de R
era 3.2.5 pero con certeza usted tendrá disponible la versión actualizada. Una
vez allí uste debe dar clic sobre Download R 3.2.5 for Windows como es
señalado por la flecha verde. Luego de esto se descargará el instalador R en el
computador el cual deberá ser instalado con las opciones que vienen por defecto.
Se recomienda observar el siguiente video didáctico de instalación de R disponi-
ble en este enlace12 para facilitar la tarea de instalación.
0.3. Apariencia del programa
Una vez que esté instalado R en su computador, usted podrá acceder a él por
la lista de programas o por medio del acceso directo que quedó en el escritorio,
en la siguiente figura se muestra la apariencia del acceso directo para ingresar
a R.
Al abrir R aparecerá en la pantalla de su computador algo similar a lo que
está en la siguiente figura. La ventana izquierda se llama consola y es donde se
ingresan las instrucciones, una vez que se construye un gráfico se activa otra
ventana llamada ventana gráfica. Cualquier usuario puede modificar la posición
y tamaños de estas ventanas, puede cambiar el tipo y tamaño de las letras en
la consola, para hacer esto se deben explorar las opciones de editar en la barra
de herramientas.
11 [Link]
12 [Link]
Tipos de objetos
En R existen varios tipos de objectos que permiten que el usuario pueda alma-
cenar la información para realizar procedimientos estadísticos y gráficos. Los
principales objetos en R son vectores, matrices, arreglos, marcos de datos y lis-
tas. A continuación se presentan las características de estos objetos y la forma
para crearlos.
0.4. Variables
Las variables sirven para almacenar un valor que luego vamos a utilizar en algún
procedimiento.
Para hacer la asignación de un valor a alguna variable se utiliza el operador <-
entre el valor y el nombre de la variable. A continuación un ejemplo sencillo.
x <- 5
2 * x + 3
## [1] 13
En el siguiente ejemplo se crea la variable pais y se almacena el nombre Co-
lombia, luego se averigua el número de caracteres de la variable pais.
pais <- "Colombia"
nchar(pais)
## [1] 8
0.5. Vectores
Los vectores vectores son arreglos ordenados en los cuales se puede almacenar
información de tipo numérico (variable cuantitativa), alfanumérico (variable cua-
litativa) o lógico (TRUE o FALSE), pero no mezclas de éstos. La función de R para
crear un vector es c() y que significa concatenar; dentro de los paréntesis de
xv
xvi TIPOS DE OBJETOS
esta función se ubica la información a almacenar. Una vez construído el vector
se acostumbra a etiquetarlo con un nombre corto y representativo de la infor-
mación que almacena, la asignación se hace por medio del operador <- entre el
nombre y el vector.
A continuación se presenta un ejemplo de cómo crear tres vectores que contienen
las respuestas de cinco personas a tres preguntas que se les realizaron.
edad <- c(15, 19, 13, NA, 20)
deporte <- c(TRUE, TRUE, NA, FALSE, TRUE)
comic_fav <- c(NA, 'Superman', 'Batman', NA, 'Batman')
El vector edad es un vector cuantitativo y contiene las edades de las 5 perso-
nas. En la cuarta posición del vector se colocó el símbolo NA que significa Not
Available debido a que no se registró la edad para esa persona. Al hacer una
asignación se acostumbra a dejar un espacio antes y después del operador <-
de asignación. El segundo vector es llamado deporte y es un vector lógico que
almacena las respuestas a la pregunta de si la persona practica deporte, nue-
vamente aquí hay un NA para la tercera persona. El último vector comic_fav
contiene la información del cómic favorito de cada persona, como esta variable
es cualitativa es necesario usar las comillas ' ' para encerrar las respuestas.
Cuando se usa NA para representar una información Not Available no se
deben usar comillas.
Es posible usar comillas sencillas 'foo' o comillas dobles "foo" para in-
gresar valores de una variable cualitativa.
Si se desea ver lo que está almacenado en cada uno de estos vectores, se debe
escribir en la consola de R el nombre de uno de los objetos y luego se presiona la
tecla enter o intro, al realizar esto lo que se obtiene se muestra a continuación.
edad
## [1] 15 19 13 NA 20
deporte
## [1] TRUE TRUE NA FALSE TRUE
comic_fav
## [1] NA "Superman" "Batman" NA "Batman"
0.6. MATRICES xvii
Una variable es un vector de longitud uno.
0.5.1. ¿Cómo extraer elementos de un vector?
Para extraer un elemento almacenado dentro un vector se usan los corchetes []
y dentro de ellos la posición o posiciones que interesan.
Ejemplo
Si queremos extraer la edad de la tercera persona escribimos el nombre del vector
y luego [3] para indicar la tercera posición de edad, a continuación el código.
edad[3]
## [1] 13
Si queremos conocer el cómic favorito de la segunda y quinta persona, escribimos
el nombre del vector y luego, dentro de los corchetes, escribimos otro vector con
las posiciones 2 y 5 que nos interesan así [c(2, 5)], a continuación el código.
comic_fav[c(2, 5)]
## [1] "Superman" "Batman"
Si nos interesan las respuestas de la práctica de deporte, excepto la de la persona
3, usamos [-3] luego del nombre del vector para obtener todo, excepto la tercera
posición.
deporte[-3]
## [1] TRUE TRUE FALSE TRUE
Si desea extraer varios posiciones de un vector NUNCA escriba esto:
mivector[2, 5, 7]. Tiene que crear un vector con las posiciones y luego
colocarlo dentro de los corchetes así: mivector[c(2, 5, 7)]
0.6. Matrices
Las matrices son arreglos rectangulares de filas y columnas con información
numérica, alfanumérica o lógica. Para construir una matriz se usa la función
matrix( ). Por ejemplo, para crear una matriz de 4 filas y 5 columnas (de
xviii TIPOS DE OBJETOS
dimensión 4 × 5) con los primeros 20 números positivos se escribe el código
siguiente en la consola.
mimatriz <- matrix(data=1:20, nrow=4, ncol=5, byrow=FALSE)
El argumento data de la función sirve para indicar los datos que se van a alma-
cenar en la matriz, los argumentos nrow y ncol sirven para definir la dimensión
de la matriz y por último el argumento byrow sirve para indicar si la información
contenida en data se debe ingresar por filas o no. Para observar lo que quedó
almacenado en el objeto mimatriz se escribe en la consola el nombre del objeto
seguido de la tecla enter o intro.
mimatriz
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 5 9 13 17
## [2,] 2 6 10 14 18
## [3,] 3 7 11 15 19
## [4,] 4 8 12 16 20
0.6.1. ¿Cómo extraer elementos de una matriz?
Al igual que en el caso de los vectores, para extraer elementos almacenados
dentro de una matriz se usan los corchetes [ , ] y dentro, separado por una
coma, el número de fila(s) y el número de columna(s) que nos interesan.
Ejemplo
Si queremos extraer el valor almacenado en la fila 3 y columna 4 usamos el
siguiente código.
mimatriz[3, 4]
## [1] 15
Si queremos recuperar toda la fila 2 usamos el siguiente código.
mimatriz[2, ] # No se escribe nada luego de la coma
## [1] 2 6 10 14 18
Si queremos recuperar toda la columna 5 usamos el siguiente código.
mimatriz[, 5] # No se escribe nada antes de la coma
0.7. ARREGLOS xix
## [1] 17 18 19 20
Si queremos recuperar la matriz original sin las columnas 2 y 4 usamos el si-
guiente código.
mimatriz[, -c(2, 4)] # Las columnas como vector
## [,1] [,2] [,3]
## [1,] 1 9 17
## [2,] 2 10 18
## [3,] 3 11 19
## [4,] 4 12 20
Si queremos recuperar la matriz original sin la fila 1 ni columna 3 usamos el
siguiente código.
mimatriz[-1, -3] # Signo de menos para eliminar
## [,1] [,2] [,3] [,4]
## [1,] 2 6 14 18
## [2,] 3 7 15 19
## [3,] 4 8 16 20
0.7. Arreglos
Un arreglo es una matriz de varias dimensiones con información numérica, alfa-
numérica o lógica. Para construir una arreglo se usa la función array( ). Por
ejemplo, para crear un arreglo de 3 × 4 × 2 con las primeras 24 letras minúsculas
del alfabeto se escribe el siguiente código.
miarray <- array(data=letters[1:24], dim=c(3, 4, 2))
El argumento data de la función sirve para indicar los datos que se van a
almacenar en el arreglo y el argumento dim sirve para indicar las dimensiones
del arreglo. Para observar lo que quedó almacenado en el objeto miarray se
escribe en la consola lo siguiente.
miarray
## , , 1
##
## [,1] [,2] [,3] [,4]
## [1,] "a" "d" "g" "j"
## [2,] "b" "e" "h" "k"
xx TIPOS DE OBJETOS
## [3,] "c" "f" "i" "l"
##
## , , 2
##
## [,1] [,2] [,3] [,4]
## [1,] "m" "p" "s" "v"
## [2,] "n" "q" "t" "w"
## [3,] "o" "r" "u" "x"
0.7.1. ¿Cómo extraer elementos de un arreglo?
Para recuperar elementos almacenados en un arreglo se usan también corchetes,
y dentro de los corchetes, las coordenadas del objeto de interés.
Ejemplo
Si queremos extraer la letra almacenada en la fila 1 y columna 3 de la segunda
capa de miarray usamos el siguiente código.
miarray[1, 3, 2] # El orden es importante
## [1] "s"
Si queremos extraer la segunda capa completa usamos el siguiente código.
miarray[,, 2] # No se coloca nada en las primeras posiciones
## [,1] [,2] [,3] [,4]
## [1,] "m" "p" "s" "v"
## [2,] "n" "q" "t" "w"
## [3,] "o" "r" "u" "x"
Si queremos extraer la tercera columna de todas las capas usamos el siguiente
código.
miarray[, 3,] # No se coloca nada en las primeras posiciones
## [,1] [,2]
## [1,] "g" "s"
## [2,] "h" "t"
## [3,] "i" "u"
0.8. MARCO DE DATOS xxi
0.8. Marco de datos
El marco de datos marco de datos o data frame es uno de los objetos más
utilizados porque permite agrupar vectores con información de diferente tipo
(numérica, alfanumérica o lógica) en un mismo objeto, la única restricción es
que los vectores deben tener la misma longitud. Para crear un marco de datos
se usa la función [Link]( ), como ejemplo vamos a crear un marco de
datos con los vectores edad, deporte y comic_fav definidos anteriormente.
mimarco <- [Link](edad, deporte, comic_fav)
Una vez creado el objeto mimarco podemos ver el objeto escribiendo su nombre
en la consola, a continuación se muestra lo que se obtiene.
mimarco
## edad deporte comic_fav
## 1 15 TRUE <NA>
## 2 19 TRUE Superman
## 3 13 NA Batman
## 4 NA FALSE <NA>
## 5 20 TRUE Batman
De la salida anterior vemos que el marco de datos tiene 3 variables (columnas)
cuyos nombres coinciden con los nombres de los vectores creados anteriormente,
los números consecutivos al lado izquierdo son sólo de referencia y permiten
identificar la información para cada persona en la base de datos.
0.8.1. ¿Cómo extraer elementos de un marco de datos?
Para recuperar las variables (columnas) almacenadas en un marco de datos
se puede usar el operador $, corchetes simples [] o corchetes dobles [[]]. A
continuación algunos ejemplos para entender las diferencias entre estas opciones.
Ejemplo
Si queremos extraer la variable deporte del marco de datos mimarco como un
vector usamos el siguiente código.
mimarco$deporte # Se recomienda si el nombre es corto
## [1] TRUE TRUE NA FALSE TRUE
Otra forma de recuperar la variable deporte como vector es indicando el número
de la columna donde se encuentra la variable.
xxii TIPOS DE OBJETOS
mimarco[, 2] # Se recomienda si recordamos su ubicacion
## [1] TRUE TRUE NA FALSE TRUE
Otra forma de extraer la variable deporte como vector es usando [[]] y dentro
el nombre de la variable.
mimarco[["deporte"]]
## [1] TRUE TRUE NA FALSE TRUE
Si usamos mimarco["deporte"] el resultado es la variable deporte pero en
forma de marco de datos, no en forma vectorial.
mimarco["deporte"]
## deporte
## 1 TRUE
## 2 TRUE
## 3 NA
## 4 FALSE
## 5 TRUE
Si queremos extraer un marco de datos sólo con las variables deporte y edad
podemos usar el siguiente código.
mimarco[c("deporte", "edad")]
## deporte edad
## 1 TRUE 15
## 2 TRUE 19
## 3 NA 13
## 4 FALSE NA
## 5 TRUE 20
Por otra, si queremos la edad de las personas que están en las posiciones 2 hasta
4 usamos el siguiente código.
mimarco[2:4, 1]
## [1] 19 13 NA
0.8. MARCO DE DATOS xxiii
0.8.2. ¿Cómo extraer subconjuntos de un marco de datos?
Para extraer partes de un marco de datos se puede utilizar la función subset(x,
subset, select). El parámetro x sirve para indicar el marco de datos original,
el parámetro subset sirve para colocar la condición y el parámetro select
sirve para quedarnos sólo con algunas de las variables del marco de datos. A
continuación varios ejemplos de la función subset para ver su utilidad.
Ejemplos
Si queremos el marco de datos mimarco sólo con las personas que SI practican
deporte usamos el siguiente código.
subset(mimarco, subset=deporte == TRUE)
## edad deporte comic_fav
## 1 15 TRUE <NA>
## 2 19 TRUE Superman
## 5 20 TRUE Batman
Si queremos el marco de datos mimarco sólo con las personas mayores o iguales
a 17 años usamos el siguiente código.
subset(mimarco, subset=edad >= 17)
## edad deporte comic_fav
## 2 19 TRUE Superman
## 5 20 TRUE Batman
Si queremos el submarco con deporte y comic de las personas menores de 20
años usamos el siguiente código.
subset(mimarco, subset=edad < 20, select=c('deporte', 'comic_fav'))
## deporte comic_fav
## 1 TRUE <NA>
## 2 TRUE Superman
## 3 NA Batman
Si queremos el marco de datos mimarco sólo con las personas menores de 20
años y que SI practican deporte usamos el siguiente código.
subset(mimarco, subset=edad < 20 & deporte == TRUE)
xxiv TIPOS DE OBJETOS
## edad deporte comic_fav
## 1 15 TRUE <NA>
## 2 19 TRUE Superman
Ejemplo
Leer la base de datos medidas del cuerpo disponible en este enlace https:
//[Link]/fhernanb/datos/master/medidas_cuerpo.
Extraer de esta base de datos una sub-base o subconjunto que contenga sólo la
edad, peso, altura y sexo de aquellos que miden más de 185 cm y pesan más de
80 kg.
url <- '[Link]
dt1 <- [Link](url, header=T)
dim(dt1) # Para conocer la dimensión de la base original
## [1] 36 6
dt2 <- subset(x=dt1, subset=altura > 185 & peso > 80,
select=c('sexo', 'edad', 'peso', 'altura'))
dt2 # Para mostrar la base de datos final
## sexo edad peso altura
## 1 Hombre 43 87.3 188.0
## 6 Hombre 33 85.9 188.0
## 15 Hombre 30 98.2 190.5
Al almacenar la nueva base de datos en el objeto dt2 se puede manipular este
nuevo objeto para realizar los análisis de interés.
0.9. Listas
Las listas son otro tipo de objeto muy usado para almacenar objetos de diferente
tipo. La instrucción para crear una lista es list( ). A continuación vamos a
crear una lista que contiene tres objetos: un vector con 5 números aleatorios
llamado mivector, una matriz de dimensión 6×2 con los primeros doce números
enteros positivos llamada matriz2 y el tercer objeto será el marco de datos
mimarco creado en el apartado anterior. Las instrucciones para crear la lista
requerida se muestran a continuación.
[Link](12345)
mivector <- runif(n=5)
matriz2 <- matrix(data=1:12, ncol=6)
milista <- list(E1=mivector, E2=matriz2, E3=mimarco)
0.9. LISTAS xxv
La función [Link] de la línea número 1 sirve para fijar la semilla de tal manera
que los números aleatorios generados en la segunda línea con la función runif
sean siempre los mismos. En la última línea del código anterior se construye la
lista, dentro de la función list se colocan los tres objetos mivector, matriz2 y
mimarco. Es posible colocarle un nombre especial a cada uno de los elementos de
la lista, en este ejemplo se colocaron los nombres E1, E2 y E3 para cada uno de
los tres elementos. Para observar lo que quedó almacenado en la lista se escribe
milista en la consola y el resultado se muestra a continuación.
milista
## $E1
## [1] 0.7209039 0.8757732 0.7609823 0.8861246 0.4564810
##
## $E2
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 3 5 7 9 11
## [2,] 2 4 6 8 10 12
##
## $E3
## edad deporte comic_fav
## 1 15 TRUE <NA>
## 2 19 TRUE Superman
## 3 13 NA Batman
## 4 NA FALSE <NA>
## 5 20 TRUE Batman
0.9.1. ¿Cómo extraer elementos de una lista?
Para recuperar los elementos almacenadas en una lista se usa el operador $,
corchetes dobles [[]] o corchetes sencillos []. A continuación unos ejemplos
para entender cómo extraer elementos de una lista.
Ejemplos
Si queremos la matriz almacenada con el nombre de E2 dentro del objeto
milista se puede usar el siguiente código.
milista$E2
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 3 5 7 9 11
## [2,] 2 4 6 8 10 12
Es posible indicar la posición del objeto en lugar del nombre, para eso se usan
los corchetes dobles.
xxvi TIPOS DE OBJETOS
milista[[2]]
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 3 5 7 9 11
## [2,] 2 4 6 8 10 12
El resultado obtenido con milista$E2 y milista[[2]] es exactamente el
mismo. Vamos ahora a solicitar la posición 2 pero usando corchetes sencillos.
milista[2]
## $E2
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 3 5 7 9 11
## [2,] 2 4 6 8 10 12
La apariencia de este último resultado es similar, no igual, al encontrado al usar
$ y [[]]. Para ver la diferencia vamos a pedir la clase a la que pertenecen los
tres últimos objetos usando la función class. A continuación el código usado.
class(milista$E2)
## [1] "matrix" "array"
class(milista[[2]])
## [1] "matrix" "array"
class(milista[2])
## [1] "list"
De lo anterior se observa claramente que cuando usamos $ o [[]] el resultado es
el objeto almacenado, una matriz. Cuando usamos [] el resultado es una lista
cuyo contenido es el objeto almacendado.
Al manipular listas con $ y [[]] se obtienen los objetos ahí almacenados,
al manipular listas con [] se obtiene una lista.
EJERCICIOS
Use funciones o procedimientos (varias líneas) de R para responder cada una de
las siguientes preguntas.
0.9. LISTAS xxvii
1. Construya un vector con la primeras 20 letras MAYÚSCULAS usando la
función LETTERS.
2. Construya una matriz de 10 × 10 con los primeros 100 números positivos
pares.
3. Construya una matriz identidad de dimension 3 × 3. Recuerde que una
matriz identidad tiene sólo unos en la diagonal principal y los demás ele-
mentos son cero.
4. Construya una lista con los anteriores tres objetos creados.
5. Construya un marco de datos o data frame con las respuestas de 3 personas
a las preguntas: (a) ¿Cuál es su edad en años? (b) ¿Tipo de música que
más le gusta? (c) ¿Tiene usted pareja sentimental estable?
6. ¿Cuál es el error al correr el siguiente código? ¿A qué se debe?
edad <- c(15, 19, 13, NA, 20)
deporte <- c(TRUE, TRUE, NA, FALSE, TRUE)
comic_fav <- c(NA, 'Superman', 'Batman', NA, 'Batman')
matrix(edad, deporte, comic_fav)
xxviii TIPOS DE OBJETOS
Guía de estilo
Así como en el español existen reglas ortográficas, la escritura de códigos en
R también tiene unas reglas que se recomienda seguir para evitar confusiones.
Tener una buena guía de estilo es importante para que el código creado por usted
sea fácilmente entendido por sus lectores (Wickham, 2015). No existe una única
y mejor guía de estilo para escritura en R, sin embargo aquí vamos a mostrar
unas sugerencias basadas en la guía llamada The tidyverse style guidee13 .
0.10. Nombres de los archivos
Se sugiere que el nombre usado para nombrar un archivo tenga sentido y que
termine con extensión “.R”. A continuación dos ejemplos de como nombrar bien
y mal un archivo.
Mal: analisis_icfes.R
Bien: ju89HR56_74.R
0.11. Nombres de los objetos
Se recomienda usar los símbolos _ dentro de los nombres de objetos.
Para las variables es preferible usar letras minúsculas (pesomaiz o
peso_maiz) o utilizar la notación camello iniciando en minúscula
(pesoMaiz).
Para las funciones se recomienda usar la notación camello iniciando todas
la palabras en mayúscula (PlotRes).
Para los nombres de las constantes se recomienda que inicien con la letra
k (kPrecioBus).
0.12. Longitud de una línea de código
Se recomienda que cada línea tenga como máximo 80 caracteres. Si una línea es
muy larga se debe cortar siempre por una coma.
13 [Link]
xxix
xxx GUÍA DE ESTILO
0.13. Espacios
Use espacios alrededor de todos los operadores binarios (=, +, -, <-, etc.). Los
espacios alrededor del símbolo = son opcionales cuando se usan para ingresar
valores dentro de una función. Así como en español, nunca coloque espacio
antes de una coma, pero siempre use espacio luego de una coma. A continuación
ejemplos de buenas y malas prácticas.
tab <- table(df[df$days < 0, 2]) # Bien
tot <- sum(x[, 1]) # Bien
tot <- sum(x[1, ]) # Bien
tab <- table(df[df$days<0, 2]) # Faltan espacios alrededor '<'
tab <- table(df[df$days < 0,2]) # Falta espacio luego de coma
tab <- table(df[df$days < 0 , 2]) # Sobra espacio antes de coma
tab<- table(df[df$days < 0, 2]) # Falta espacio antes de '<-'
tab<-table(df[df$days < 0, 2]) # Falta espacio alrededor de '<-'
tot <- sum(x[,1]) # Falta espacio luego de coma
tot <- sum(x[1,]) # Falta espacio luego de coma
Otra buena práctica es colocar espacio antes de un paréntesis excepto cuando
se llama una función.
if (debug) # Correcto
if(debug) # Funciona pero no se recomienda
colMeans (x) # Funciona pero no se recomienda
Espacios extras pueden ser usados si con esto se mejora la apariencia del código,
ver el ejemplo siguiente.
plot(x = [Link],
y = [Link][, MakeColName(metric, ptiles[1], "roiOpt")],
ylim = ylim,
xlab = "dates",
ylab = metric,
main = (paste(metric, " for 3 samples ", sep = "")))
No coloque espacios alrededor del código que esté dentro de paréntesis ( ) o
corchetes [ ], la única excepción es luego de una coma, ver el ejemplo siguiente.
if (condicion) # Correcto
x[1, ] # Correcto
if ( condicion ) # Sobran espacios alrededor de condicion
x[1,] # Se necesita espacio luego de coma
0.13. ESPACIOS xxxi
Los signos de agrupación llaves { } se utilizan para agrupar bloques de código
y se recomienda que nunca una llave abierta { esté sola en una línea; una llave
cerrada } si debe ir sola en su propia línea. Se pueden omitir las llaves cuando el
bloque de instrucciones esté formado por una sola línea pero esa línea de código
NO debe ir en la misma línea de la condición. A continuación dos ejemplos de
lo que se recomienda.
if ([Link](ylim)) { # Correcto
ylim <- c(0, 0.06)
}
if ([Link](ylim)) # Correcto
ylim <- c(0, 0.06)
if ([Link](ylim)) ylim <- c(0, 0.06) # Aceptable
if ([Link](ylim)) # No se recomienda
{
ylim <- c(0, 0.06)
}
if ([Link](ylim)) {ylim <- c(0, 0.06)}
# Frente a la llave { no debe ir nada
# la llave de cierre } debe ir sola
La sentencia else debe ir siempre entre llaves } {, ver el siguiente ejemplo.
if (condition) {
one or more lines
} else { # Correcto
one or more lines
}
if (condition) {
one or more lines
}
else { # Incorrecto
one or more lines
}
if (condition)
one line
xxxii GUÍA DE ESTILO
else # Incorrecto
one line
0.14. Asignación
Para realizar asignaciones se recomienda usar el símbolo <-, el símbolo de igual-
dad = no se recomienda usarlo para asignaciones.
x <- 5 # Correcto
x = 5 # No recomendado
Para una explicación más detallada sobre el símbolo de asignación se recomienda
visitar este enlace14 .
0.15. Punto y coma
No se recomienda colocar varias instrucciones separadas por ; en la misma línea,
aunque funciona dificulta la revisión del código.
n <- 100; y <- rnorm(n, mean=5); hist(y) # No se recomienda
n <- 100 # Correcto
y <- rnorm(n, mean=5)
hist(y)
A pesar de la anterior advertencia es posible que en este libro usemos el ; en
algunas ocasiones, si lo hacemos es para ahorrar espacio en la presentación del
código.
14 [Link]
Ingresando datos a R
En este capítulo se muestra como ingresar datos a R.
0.16. Usando la consola
La función readline básica de R sirve para escribir un mensaje en la consola
y solicitar al usuario una información que luego se puede utilizar para realizar
alguna operación.
Abajo se muestra un código de R que el lector puede copiar y pegar en un script.
El código se debe ejecutar línea por línea y no en bloque.
La primera línea solicita el nombre del usuario y lo almacena automáticamente
en la variable my_name. La segunda línea solicita la edad y la almacena en la
variable my_age. La tercera se asegura que la edad se convierta a un número
entero. La cuarta instrucción, escrita en varias líneas, saluda y entrega la edad
del usuario en el próximo año.
my_name <- readline(prompt="Ingrese su nombre: ")
my_age <- readline(prompt="Ingrese su edad en años: ")
my_age <- [Link](my_age) # convert character into integer
print(paste("Hola,", my_name,
"el año siguiente usted tendra",
my_age + 1,
"años de edad."))
0.17. Usando ventana emergente con svDialogs
El paquete svDialogs se puede utilizar para crear ventanas emergentes con
un mensaje y solicitando información que luego se puede utilizar para realizar
alguna operación.
xxxiii
xxxiv INGRESANDO DATOS A R
Abajo se muestra un código de R que el lector puede copiar y pegar en un script.
El código se puede ejecutar en bloque.
Este ejemplo hace lo mismo que el ejemplo anterior pero con la ventaja de abrir
una ventana emergente para mostrar un mensaje y solicitar alguna información.
Lo primero que se debe hacer es cargar el paquete svDialogs, si aún no lo ha
instalado puede hacer escribiendo
[Link]("svDialogs") # Para instalar el paquete
library(svDialogs) # Para usar el paquete
my_name <- dlgInput(message="Ingrese su nombre: ")$res
my_age <- dlgInput(message="Ingrese su edad en años: ")$res
my_age <- [Link](my_age) # convert character into integer
print(paste("Hola,", my_name,
"el año siguiente usted tendá",
my_age + 1,
"años de edad."))
En la siguiente figura se muestran las cajas solicitando la información.
Abajo la salida luego de correr todo el código del ejemplo.
## [1] "Hola, Pedro el año siguiente usted tendr 26 años de edad."
0.18. Botones para responder
La función winDialog del paquete básico __utils_ sirve para crear botones de
diálogo en Windows solamente. A continuación se muestra la forma de generar
los 4 tipos de botones.
library(utils)
winDialog(type="ok", message="¿Usted quiere BORRAR el archivo?")
winDialog(type="okcancel", message="¿Usted quiere BORRAR el archivo?")
winDialog(type="yesno", message="¿Usted quiere BORRAR el archivo?")
winDialog(type="yesnocancel", message="¿Usted quiere BORRAR el archivo?")
En la siguiente figura están las imágenes de los 4 tipos de botones.
A continuación se muestra un ejemplo de cómo usar un botón para preguntar
y luego imprimir en la consola un mensaje dependiendo de la respuesta. Copie
todo el siguiente código en la consola y vea el resultado.
0.18. BOTONES PARA RESPONDER xxxv
answer <- winDialog(type="yesno", mess="¿Le sirvió mi sugerencia?")
if (answer=='YES') {print('Excelente!')} else {print('Lástima')}
xxxvi INGRESANDO DATOS A R
Funciones básicas de R
En este capítulo se presentará lo que es una función y se mostrarán varias
funciones básicas que son útiles para realizar diversas tareas.
0.19. ¿Qué es una función de R?
En la figura de abajo se muestra una ilustración de lo que es una función o
máquina general. Hay unas entradas (inputs) que luego son procesadas dentro
de la caja para generar unas salidas (outputs). Un ejemplo de una función o
máquina muy común en nuestras casas es la licuadora. Si a una licuadora le
ingresamos leche, fresas, azúcar y hielo, el resultado será un delicioso jugo de
fresa.
Las funciones en R se caracterizan por un nombre corto y que dé una idea de lo
que hace la función. Los elementos que pueden ingresar (inputs) a la función se
llaman parámetros o argumentos y se ubican dentro de paréntesis, el cuerpo
de la función se ubica dentro de llaves y es ahí donde se procesan los inputs para
convertirlos en outputs, a continuación se muestra la estructura general de una
función.
nombre_de_funcion(parametro1, parametro2, ...) {
tareas internas
tareas internas
tareas internas
salida
}
Cuando usamos una función sólo debemos escribir bien el nombre e ingresar
correctamente los parámetros de la función, el cuerpo de la función ni lo vemos
ni lo debemos modificar. A continuación se presenta un ejemplo de cómo usar
la función mean para calcular un promedio.
xxxvii
xxxviii FUNCIONES BÁSICAS DE R
notas <- c(4.0, 1.3, 3.8, 2.0) # Notas de un estudiante
mean(notas)
## [1] 2.775
0.20. Operadores de asignación
En R se pueden hacer asignación de varias formas, a continuación se presentan
los operadores disponibles para tal fin.
<- este es el operador de asignación a izquierda, es el más usado y reco-
mendado.
-> este es el operador de asignación a derecha, no es frecuente su uso.
= el símbolo igual sirve para hacer asignaciones pero NO se recomienda
usarlo.
<<- este es un operador de asignación global y sólo debe ser usado por
usuarios avanzados.
Ejemplo
Almacene los valores 5.3, 4.6 y 25 en los objetos a, b y age respectivamente, use
diferentes símbolos de asignación.
Para hacer lo solicitado se podría usar el siguiente código.
a <- 5.3 # Recomended
4.6 -> b # It is not usual
age = 25 # Not recomended
Aunque una asignación se puede hacer de tres formas diferentes, se reco-
mienda sólo usar el símbolo <-.
0.21. Operaciones básicas
En R se pueden hacer diversas operaciones usando operadores binarios. Este
tipo de operadores se denomina binarios porque actuan entre dos objetos, a
continuación el listado.
+ operador binario para sumar.
- operador binario para restar.
* operador binario para multiplicar.
/ operador binario para dividir.
^ operador binario para potencia.
0.21. OPERACIONES BÁSICAS xxxix
%/ % operador binario para obtener el cociente en una división (número
entero).
% % operador binario para obtener el residuo en una división.
A continuación se presentan ejemplos de cómo usar las anteriores funciones.
6 + 4 # Para sumar dos números
## [1] 10
a <- c(1, 3, 2)
b <- c(2, 0, 1) # a y b de la misma dimensión
a + b # Para sumar los vectores a y b miembro a miembro
## [1] 3 3 3
a - b # Para restar dos vectores a y b miembro a miembro
## [1] -1 3 1
a * b # Para multiplicar
## [1] 2 0 2
a / b # Para dividir
## [1] 0.5 Inf 2.0
a ^ b # Para potencia
## [1] 1 1 2
7 %/ % 3 # Para saber las veces que cabe 3 en 7
## [1] 2
7 %% 3 # Para saber el residuo al dividir 7 entre 3
## [1] 1
xl FUNCIONES BÁSICAS DE R
0.22. Pruebas lógicas
En R se puede verificar si un objeto cumple una condición dada, a continuación
el listado de las pruebas usuales.
< para saber si un número es menor que otro.
> para saber si un número es mayor que otro.
== para saber si un número es igual que otro.
<= para saber si un número es menor o igual que otro.
>= para saber si un número es mayor o igual que otro.
A continuación se presentan ejemplos de cómo usar las anteriores funciones.
5 < 12 # ¿Será 5 menor que 12?
## [1] TRUE
# Comparando objetos
x <- 5
y <- 20 / 4
x == y # ¿Será x igual a y?
## [1] TRUE
# Usando vectores
a <- c(1, 3, 2)
b <- c(2, 0, 1)
a > b # Comparación término a término
## [1] FALSE TRUE TRUE
a == b # Comparación de igualdad término a término
## [1] FALSE FALSE FALSE
Ejemplo
Crear un vector con los números de 1 a 17 y extrater los números que son
mayores o iguales a 12.
Primero se crear el vector x con los elementos del 1 al 17. La prueba lógica x >=
12 se usa para evaluar la condición, el resultado es un vector de 17 posiciones
con valores de TRUE o FALSE dependiendo de si la condición se cumple o no.
Este vector lógico se coloca dentro de x[ ] para que al evaluar x[x >= 12] sólo
aparezcan los valores del vector original que SI cumplen la condición. El código
necesario se muestra a continuación.
0.22. PRUEBAS LÓGICAS xli
x <- 1:17 # Se crea el vector
x[x >= 12] # Se solicitan los valores que cumplen la condición
## [1] 12 13 14 15 16 17
Ejemplo
Retome el marco de datos mimarco construído en la sección 2.4 y use una prueba
lógica para extraer la información de las personas que tienen una edad superior
o igual a 15 años.
Inicialmente vamos a construir nuevamente el objeto mimarco de la sección 2.4
usando el siguiente código.
mimarco <- [Link](edad = c(15, 19, 13, NA, 20),
deporte = c(TRUE, TRUE, NA, FALSE, TRUE),
comic_fav = c(NA, 'Superman', 'Batman', NA, 'Batman'))
mimarco # Para ver el contenido de mimarco
## edad deporte comic_fav
## 1 15 TRUE <NA>
## 2 19 TRUE Superman
## 3 13 NA Batman
## 4 NA FALSE <NA>
## 5 20 TRUE Batman
Para extraer de mimarco la información de las personas que tienen una edad su-
perior o igual a 15 años se coloca dentro de corchetes la condición mimarco$edad
>= 15, esto servirá para chequear cuáles de las edades del vector mimarco$ead
cumplen la condición. El resultado de evaluar mimarco$edad >= 15 será un
vector lógico (TRUE o FALSE), que al ser colocado dentro de mimarco[,], entre-
gará la información de las personas que cumplen la condición. A continuación
el código para extraer la información solicitada.
mimarco[mimarco$edad >= 15, ]
## edad deporte comic_fav
## 1 15 TRUE <NA>
## 2 19 TRUE Superman
## NA NA NA <NA>
## 5 20 TRUE Batman
De la salida anterior se observa que 4 personas de las 5 cumplean la condición.
xlii FUNCIONES BÁSICAS DE R
Note que la condición mimarco$edad >= 15 se debe ubicar antes de la
coma para obtener todos individuos que cumplen con la condición.
0.23. Operadores lógicos
En R están disponibles los operadores lógicos negación, conjunción y disyunción.
A continuación el listado de los operadores entre los elementos x e y.
!x # Negación de x
x & y # Conjunción entre x e y
x && y
x | y # Disyunción entre x e y
x || y
xor(x, y)
A continuación se presentan ejemplos de cómo usar el símbolo de negación !.
ans <- c(TRUE, FALSE, TRUE)
!ans # Negando las respuestas almacenadas en ans
## [1] FALSE TRUE FALSE
x <- c(5, 1.5, 2, 3, 2)
!(x < 2.5) # Negando los resultados de una prueba
## [1] TRUE FALSE FALSE TRUE FALSE
A continuación se presentan ejemplos de cómo aplicar la conjunción & y &&.
x <- c(5, 1.5, 2) # Se construyen dos vectores para la prueba
y <- c(4, 6, 3)
x < 4 # ¿Serán los elementos de x menores que 4?
## [1] FALSE TRUE TRUE
y > 5 # ¿Serán los elementos de y mayores que 5?
## [1] FALSE TRUE FALSE
0.23. OPERADORES LÓGICOS xliii
x < 4 & y > 5 # Conjunción entre las pruebas anteriores.
## [1] FALSE TRUE FALSE
x < 4 && y > 5 # Conjunción vectorial
## [1] FALSE
Note las diferencias entre los dos últimos ejemplos, cuando se usa & se hace una
prueba término a término y el resultado es un vector, cuando se usa && se aplica
la conjunción al vector de resultados obtenido con &.
Ejemplo
Retome el marco de datos mimarco construído en la sección 2.4 y use una prueba
lógica para extraer la información de las personas que tienen una edad superior
o igual a 15 años y que practican deporte.
Aquí interesa extraer la información de los individuos que cumplen dos condi-
ciones simultáneamente, aquellos con edad ≥ 15 y que SI practiquen deporte.
El código necesario para obtener la información solicitada es el siguiente.
mimarco[mimarco$edad >= 15 & mimarco$deporte == TRUE, ]
## edad deporte comic_fav
## 1 15 TRUE <NA>
## 2 19 TRUE Superman
## 5 20 TRUE Batman
De la anterior salida se observa que sólo 3 de las 5 personas cumplen ambas
condiciones.
La función with es útil porque nos permite realizar algún procedimiento
en relación de un objeto, escribiendo menos y de una forma más natural.
Una forma alternativa para escribir lo anterior usando la función with es la
siguiente.
with(mimarco, mimarco[edad >= 15 & deporte == TRUE, ])
## edad deporte comic_fav
## 1 15 TRUE <NA>
## 2 19 TRUE Superman
## 5 20 TRUE Batman
xliv FUNCIONES BÁSICAS DE R
Al usar with sólo se tuvo que escribir el objeto mimarco dos veces. Cuando hay
muchas condiciones o cuando el objeto tiene un nombre largo es aconsejable
usar with.
0.24. Funciones sobre vectores
En R podemos destacar las siguientes funciones básicas sobre vectores numéri-
cos.
min: para obtener el mínimo de un vector.
max: para obtener el máximo de un vector.
length: para determinar la longitud de un vector.
range: para obtener el rango de valores de un vector, entrega el mínimo y
máximo.
sum: entrega la suma de todos los elementos del vector.
prod: multiplica todos los elementos del vector.
[Link]: nos entrega la posición en donde está el valor mínimo del
vector.
[Link]: nos da la posición del valor máximo del vector.
rev: invierte un vector.
Ejemplo
Construir en vector llamado myvec con los siguientes elementos: 5, 3, 2, 1, 2,
0, NA, 0, 9, 6. Luego aplicar todas las funciones anteriores para verificar el
funcionamiento de las mismas.
myvec <- c(5, 3, 2, 1, 2, 0, NA, 0, 9, 6)
myvec
## [1] 5 3 2 1 2 0 NA 0 9 6
min(myvec) # Opss, no aparece el mínimo que es Cero.
## [1] NA
min(myvec, [Link]=TRUE) # Usamos [Link] = TRUE para remover el NA
## [1] 0
max(myvec, [Link]=T) # Para obtener el valor máximo
## [1] 9
0.25. FUNCIONES MATEMÁTICAS xlv
range(myvec, [Link]=T) # Genera min y max simultáneamente
## [1] 0 9
sum(myvec, [Link]=T) # La suma de los valores internos
## [1] 28
prod(myvec, [Link]=T) # El productor de los valores internos
## [1] 0
[Link](myvec) # Posición del valor mínimo 0 en el vector
## [1] 6
[Link](myvec) # Posición del valor máximo 9 en el vector
## [1] 9
De las dos últimas líneas podemos destacar lo siguiente:
1. NO es necesario usar [Link] = TRUE para remover el NA dentro de las
funciones [Link] ni [Link].
2. El valor mínimo 0 aparece en las posiciones 6 y 8 pero la función [Link]
sólo entrega la posición del primer valor mínimo dentro del vector.
0.25. Funciones matemáticas
Otras funciones básicas muy utilizadas en estadística son: sin, cos, tan,
asin, acos, atan, atan2, log, logb, log10, exp, sqrt, abs. A conti-
nuación algunos ejemplos de las anteriores funciones.
Ejemplos de medidas trigonométricas
angulos <- c(0, pi/2, pi)
sin(angulos)
## [1] 0.000000e+00 1.000000e+00 1.224606e-16
tan(angulos)
xlvi FUNCIONES BÁSICAS DE R
## [1] 0.000000e+00 1.633124e+16 -1.224647e-16
Ejemplos de logaritmos
log(100)
## [1] 4.60517
log10(100)
## [1] 2
logb(125, base=5)
## [1] 3
Ejemplos de exponencial
exp(1)
## [1] 2.718282
exp(2)
## [1] 7.389056
exp(1:3)
## [1] 2.718282 7.389056 20.085537
Ejemplos de raices
sqrt(49) # Raiz cuadrada de 49
## [1] 7
27 ^ (1/3) # Raiz cúbica de 27
## [1] 3
Ejemplos de valor absoluto
0.26. FUNCIÓN SEQ xlvii
abs(2.5)
## [1] 2.5
abs(-3.6)
## [1] 3.6
0.26. Función seq
En R podemos crear secuencias de números de una forma sencilla usando la
función seq, la estructura de esta función es:
seq(from=1, to=1, by, [Link])
Los argumentos de esta función son:
from: valor de inicio de la secuencia.
to: valor de fin de la secuencia, no siempre se alcanza.
by: incremento de la secuencia.
[Link]: longitud deseado de la secuencia.
Ejemplo
Construya las siguientes tres secuencias usando la función seq.
Once valores igualmente espaciados desde 0 hasta 1.
Una secuencia de dos en dos comenzando en 1.
Una secuencia desde 1 con un salto de 𝜋 y sin pasar del número 9.
El código necesario para obtener las secuencias se muestra a continuación.
seq(from=0, to=1, [Link] = 11)
## [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
seq(from=1, to=9, by=2) # matches 'end'
## [1] 1 3 5 7 9
seq(from=1, to=9, by=pi) # stays below 'end'
## [1] 1.000000 4.141593 7.283185
xlviii FUNCIONES BÁSICAS DE R
En R existe el operador binario : que sirve para construir secuencias de
uno en uno fácilmente.
Revise los siguientes ejemplos para entender el funcionamiento del operador :.
2:8
## [1] 2 3 4 5 6 7 8
3:-5
## [1] 3 2 1 0 -1 -2 -3 -4 -5
pi:6 # real sequence
## [1] 3.141593 4.141593 5.141593
6:pi # integer sequence
## [1] 6 5 4
0.27. Función rep
En R podemos crear repeticiones usando la función rep, la estructura de esta
función es:
rep(x, times=1, [Link]=NA, each=1)
Los argumentos de esta función son:
x: vector con los elementos a repetir.
times: número de veces que el vector x se debe repetir.
[Link]: longitud deseada para el vector resultante.
each: número de veces que cada elemento de x se debe repetir.
Ejemplo
Construya las siguientes repeticiones usando la función rep, no lo haga ingre-
sando número por número.
12341234
11223344
112334
0.27. FUNCIÓN REP xlix
11223344
La clave para construir una repetición es descrubir la semilla o elemento que se
repite. Las instrucciones para obtener las repeticiones anteriores se muestra a
continuación.
rep(x=1:4, times=2)
## [1] 1 2 3 4 1 2 3 4
rep(x=1:4, times=c(2,2,2,2))
## [1] 1 1 2 2 3 3 4 4
rep(x=1:4, times=c(2,1,2,1))
## [1] 1 1 2 3 3 4
rep(x=1:4, each=2)
## [1] 1 1 2 2 3 3 4 4
Ejemplo
La función rep es muy versátil, observe los siguientes 4 ejemplos y saque una
conclusión de cada uno de ellos.
rep(x=1:4, each=2)
## [1] 1 1 2 2 3 3 4 4
rep(x=1:4, each=2, len=4) # first 4 only.
## [1] 1 1 2 2
rep(x=1:4, each=2, len=10) # 8 integers plus two recycled 1's.
## [1] 1 1 2 2 3 3 4 4 1 1
rep(x=1:4, each=2, times=3) # length 24, 3 complete replications
## [1] 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4
l FUNCIONES BÁSICAS DE R
0.28. Funciones round, ceiling, floor y trunc
Existen 4 funciones útiles para modificar u obtener información de un número,
estas funciones son round, ceiling, floor y trunc.
round(x, digits): sirve para redondear un número según los dígitos in-
dicados.
ceiling(x): entrega el mínimo entero mayor o igual que x.
floor(x): entrega el máximo entero menor o igual que x.
trunc(x): entrega la parte entera de un número x.
Ejemplo
Aplique las funciones round, ceiling, floor y trunc a un valor positivo y a
un valor negativo para inspeccionar los resultados.
A continuación el código de prueba para un número positivo cualquiera.
x <- 5.34896 # Número positivo elegido
round(x, digits=3)
## [1] 5.349
ceiling(x)
## [1] 6
floor(x)
## [1] 5
trunc(x)
## [1] 5
A continuación las pruebas con un número negativo cualquiera.
x <- -4.26589 # Número negativo elegido
round(x, digits=3)
## [1] -4.266
ceiling(x)