Sección 2 Introducción a R y RStudio
R es un lenguaje y un entorno de programación con un enfoque originalmente al análisis estadístico. Es uno de los lenguajes de programacón más utilizados en la investigación científica y en otras campos como el aprendizaje automático, minería de datos, bioinformática, matemáticas financieras. Está disponible para los sistemas operativos Windows, Linux y Macintosh.
Algunas características de R son las siguientes:
- Sintaxis clara y legible.
- Orientación a objetos intuitiva.
- Enfocado al análisis estadístico.
- Tipos de datos dinámicos de muy alto nivel.
Una desventaja sobre todo para los principiantes es que utiliza una consola de comandos en lugar de una interfaz gráfica por lo cual el dominio de la sintaxis se vuelve muy exigente y requiere de mucha practica.
RStudio es un Entorno de Desarrollo Integrado (IDE), es decir es un conjunto de herramientas e interfaces que facilitan la programación y que están integrados por algunos de los siguientes elementos:
- Editor.
- Depurador.
- Compilador.
- Interfaz de ejecución.
- Gestor de componentes.
- Control de versiones.
2.1 Descarga de R y Rstudio
Lo primero será instalar R según su sistema operativo. Una vez instalado R, vamos a descargar e instalar RStudio.
2.2 RStudio
En RStudio tenemos 3 paneles principales:
- La consola interactiva de R y una Terminal a la izquierda.
- El panel Enviroment, History y Connections, arriba a la derecha.
- El panel Files, Plots, Packages, Help, Viewer, abajo a la derecha.
Cuando abrimos algún archivo, por ejemplo un script de R, vamos a desplegar un cuarto panel arriba a la izquierda.
Existen dos formas principales de trabajar con RStudio:
Interactuar con la consola de R.
Escribir en un script.
Para correr un comando en RStudio tenemos tres opciones:
- Dar click en el botón
Run
en del cuarto panel. - Seleccionar
Correr líneas
desde el menú “Code”. - Seleccionar la línea a ejecutar (o dejar el cursor en esa línea) y usar la combinación de teclas
Ctrl
+Enter
.
2.3 R como calculadora
R permite realizar la mayoría de las operaciones matemáticas. Por ejemplo, sumas, restas, raíces cuadradas, exponenciales e incluso permite trabajar con números complejos. La jerarquía de operaciones prevalece y además la mayoría de las funciones matemáticas tienen el mismo nombre de las calculadoras científicas.
2.3.1 Ejemplos de uso de R como calculadora
- Los comandos
+
,-
,*
,/
y^
tienen el significado usual.
## [1] 2
- Para raíces cuadradas de números positivos se escribe
sqrt(ARG)
, dondeARG
es un real positivo.
## [1] 4
## [1] 23
## [1] 1e-05
## [1] 2000
- Para el uso de funciones trigonométricas usuales (por default se calcula en radianes):
sin(ARG)
,cos(ARG)
,tan(ARG)
son el seno, cose y tangente usuales deARG
. Además por default tiene el valor de \(\pi\) guardador bajo el nombre depi
.
## [1] 1
## [1] 3.141593
- Para calcular exponenciales usamos
exp(ARG)
ylog(ARG1, base = ARG2)
, dondeARG2
es la base del logaritmos. El número \(e\) se optiene comoexp(1)
.
## [1] 2.718282
## [1] 1
## [1] 2
## [1] 2
## [1] 0
Con los datos flotantes, podemos tener problemas de precisión. Un paquete que ayuda a esto es Rmpfr
.
## 1 'mpfr' number of precision 54 bits
## [1] 2.23399476616171112e+308
- La división entera de \(\lfloor \frac{ARG1}{ARG2}\rfloor\) se obtiene escribiendo
ARG1 %/% ARG2
.
## [1] 8.666667
## [1] 8
## [1] 2
- También tenemos las funciones factorial \(ARG!\) y combinaciones \(\binom{ARG1}{ARG2}\).
## [1] 6
## [1] 3
- En R, cuando hay presencia de división entre 0, nos devuelve como resultado
Inf
o-Inf
, dependiendo del signo del numerador, oNaN
cuando el numerador es 0.
## [1] Inf
## [1] -Inf
## [1] NaN
- También aparece
NaN
cuando sacamos raíces de números negativos.
## Warning in sqrt(-9): Se han producido NaNs
## [1] NaN
- R es capaz de trabajar con números complejos.
## [1] 0+2i
- Los
NaN
tiene su propia aritmética.
# Ejercicio: explorar que sucede al operar con NaN
# NaN / 0
# NaN + 1
# NaN * 2
# NaN + Inf
# NaN /Inf
- Para pedir ayuda con funciones, se escribe en la consola
?sin()
.
2.4 Operador de asignación y nombres de las variables
En el caso de RStudio, el operador de asignación de variables es <-
y la sintaxis que se usa es VARIABLE <- VALOR
.
## [1] 1
## [1] 4
La combinación de teclas para obtener el operador <-
es Alt
+ -
.
Una buena practica es que los nombres asignados a nuestros valores sean descriptivos. En R, existen ciertos palabras reservadas que no podemos usar como variables, también no deben de empezar con números o algúnc caracter extraño.
Algunos estilos de nombres usuales para variables son los siguientes:
num_de_euler
NumDeEuler
num.de.euler
num_de.Euler
2.5 Tipos de Objetos
Existen dos tipos de datos: atómicos y estructurados. Un dato atómico es aquel que se considera unidad mínima de información, como los números enteros y un dato estructurado es una colección de datos atómicos.
Datos atómicos:
- Lógico: Datos que solo permiten los valores lógicos
TRUE
yFALSE
. - Numérico: Datos cuyos valores son números reales.
- Complejo: Datos cuyos valores son números complejos.
- Caracter: Datos cuyos valores son cualquier tipo de carácter o cadena.
Datos estructurados:
- Arreglos: colecciones multidimensionales de datos.
- Vectores: Arreglos unidimensionales. Cada uno de sus elementos es del mismo tipo.
- Matrices: Arreglos de dos dimensiones. Todos sus datos son del mismo tipo.
- Dataframes: Son arreglos de dos dimensiones. Los datos de una misma columna son del mismo tipo pero puede variar el tipo de dato en diferente columna.
- Listas: colecciones unidimensionales de datos donde cada elemento puede ser de un tipo diferente.
En R, casi todo lo que se manipula son objetos. Cada objeto tiene sus propias características como tamaño, dimensiones, longitud, tipo y sus propias funciones. Los objetos más comunes en R son:
- Vectores
- Matrices
- Arreglos
- Listas
- Dataframes
2.5.1 Vectores en R
Uno de los objetos más simples pero poderosos de R son los vectores. Los vectores son listas ordenadas de datos. Para crear un vector usamos la asignación vector <- c("dato1", "dato2")
. Por ejemplo, mi_vector <- c("hola", "clase", "1")
, en este caso el elemento hola
es el primer elemento del vector, además todos los elementos son del mismo tipo texto que llamaremos strings.
Podemos calcular la longitud de los vectores en R usando la función length(vector)
.
## [1] 3
Los elementos de los vectores los podemos llamar a través de índices. R siempre indexa desde el número 1 a diferencia de Python que indexa en 0.
## [1] "hola"
En R podemos realizar operaciones vectorizadas, es decir se pueden aplicar las operaciones a cada elemento de nuestro vector.
En R la mayoría de las operaciones matemáticas están vectorizadas como la multiplicación, raíces, divisiones, logaritmos o exponenciales.
## [1] 1 2 3
## [1] 1 4 9
Se pueden combinar también las operaciones vectorizadas e índices.
## [1] 20
Las sumas y restas tienen un comportamiento especial.
#Ejercicio: Crea dos vectores de la misma longitud y súmalos.
#¿Qué realiza la suma de vectores?
#¿Qué pasa si sumas vectores de diferente longitud?
Otras operaciones vectorizadas son las comparaciones. Los operadores de comparación que podemos usar en R son los siguientes:
==
para ver igualdad.!=
para ver diferencia.>=
para ver si el lado izquierdo es mayor o igual que el derecho.<=
para ver si el lado izquierdo es menor o igual que el lado derecho.>
para ver si el lado izquierdo es mayor que el lado derecho.<
para ver si el lado izquierdo es menor que el lado derecho.
## [1] TRUE
## [1] TRUE TRUE FALSE
Si tenemos dos expresiones lógicas, podemos usar también los siguientes operadores:
&
es la conjunción.|
es la disyunción.!
es la negación.
## [1] TRUE
## [1] FALSE
Las sequencias regulares se pueden formar con el operador :
.
## [1] 1 2 3
El operador :
tiene prioridad sobre otros operadores.
Para formar una sequencia de números reales se usa la función seq
, la sintaxis es como sigue: seq(from= 1, to=n, by=k, length.out = NULL )
,
## [1] 1 6 11 16 21 26 31 36
## [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
#Ejercicio: ¿Qué pasa si invertimos el orden de las entradas en la función `seq`?
# seq(by=2, to=10, from=1)
La función seq
se puede combianar con la creación de vectores.
Otra función que es útil para crear vectores es rep(Z,n)
, esta función crea un vector de n
elementos todos iguales a Z
.
## [1] 2 2 2 2 2 2 2 2 2 2
## [1] 1.0 2.0 3.0 4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0 8.5 9.0 9.5
## [16] 10.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0 2.0
Las variables se pueden reescribir.
## [1] "2" "2" "2" "2" "2" "2" "2" "2" "2" "2"
## [11] "hola"
#Ejercicio: ¿Qué sucedió con el vector y?
#¿De que tipo son sus elementos ahora?
#Realizar la operación y+2.
Podemos convertir objetos de un tipo a otro compatible usando las funciones as.(nombre_del_nuevo_tipo_de_objeto)
. Por ejemplo, nuestro vector y
ahora es del tipo caracter, podemos quitar el elemento que es de tipo caracter y convertirlo a un nuevo objeto ahora de tipo numérico.
## [1] "hola"
## [1] 1
Las funciones elementales como exp
, log
, sin
, etc las podemos aplicar a los vectores siempre y cuando los elementos de nuestro vector estén en el dominimo de la función correspondiente.
## [1] 0.0000000 0.6931472 1.3862944
## Warning in log(c(-1, 2, 3)): Se han producido NaNs
## [1] NaN 0.6931472 1.0986123
Otras funciones útiles para vectores son:
max(x)
ymin(x)
: elemento máximo y mínimo del vector \(x\).sum(x)
yprod(x)
: nos devuelve la suma y producto de los elementos del vector \(x\).mean(x)
yvar(x)
: nos devuelve la media y varianza del vector \(x\).sort(x)
: ordena los elementos del vector \(x\) de manera creciente. Si agregamos el argumentodecreasing=TRUE
los ordena de mayor a menor.order(x)
: nos da los índices correspondientes al ordenamiento de los elementos de \(x\) de menor a mayor.
## [1] 2 4 6 9 10
## [1] 2 5 1 3 4
## [1] 10 9 6 4 2
## [1] 31
## [1] 4320
## [1] 6.2
## [1] 11.2
Podemos también seleccionar elementos de un vector y cambiarlos.
## [1] 1 0 3 0 5 0 7 0 9 0
## [1] 1 0 2 0 4 0 7 0 9 0
En el caso de vectores de caracteres, dos funciones que son útiles son substr()
y substring()
las cuales nos sirven para extraer cierta cantidad de caracteres de cada entrada del vector. La sintaxis es la siguiente: substr(x,inicio,final)
y substring(x,inicio,last=1000000L)
.
clases <- c("01.Matemáticas", "02.Español", "03.Ciencias",
"04.Física", "05.Geografía")
substring(clases,4,last=1000000L)
## [1] "Matemáticas" "Español" "Ciencias" "Física" "Geografía"
## [1] "01" "02" "03" "04" "05"
La función names()
nos ayuda a darle un nombre a las entradas de los vectores, es decir en lugar de índices númericos ahora podemos asignarle un nombre a cada entrada.
## NULL
## [1] "Matemáticas" "Español" "Ciencias" "Física" "Geografía"
## Matemáticas Español Ciencias Física Geografía
## 10 8 9 7 8
2.5.2 Arreglos
Un array es una colección de datos, todos del mismo tipo, indexada por varios índices, es decir son objetos multidimensionales en R.
Si \(dim=c(x_1,x_2,x_3...)\), donde \(x_1\), \(x_2\), \(x_3\), etc son enteros, entonces \(x_1\) es el número de filas, \(x_2\) es el número de columnas, \(x_3\) es el número de capas del array.
Una forma de crear arrays es primero crear un vector y después pasarle las dimensiones del arreglo.
## [1] 6 10
La función array()
resume estas dos instrucciones. Su sintáxis es la siguiente: array(vector, dim = dimensiones)
.
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 1 7 13 19 25 31 37 43 49 55
## [2,] 2 8 14 20 26 32 38 44 50 56
## [3,] 3 9 15 21 27 33 39 45 51 57
## [4,] 4 10 16 22 28 34 40 46 52 58
## [5,] 5 11 17 23 29 35 41 47 53 59
## [6,] 6 12 18 24 30 36 42 48 54 60
La función class(objeto)
nos permite conocer el tipo de objeto con el que estamos trabajando.
## [1] "matrix" "array"
## [1] "matrix" "array"
#Ejercicio: crear otro array z con el mismo vector x y 3 dimensiones y verifica el tipo de objeto que es z.
Las funciones ncol()
y nrow()
nos permiten conocer cuantas columnas y filas tienen los arrays en cada una de sus capas.
## [1] 10
## [1] 6
Como la función dim()
nos dice las dimensiones de nuestro objeto, las funciones anteriores son equivalentes a lo siguiente:
## NULL
## NULL
## NULL
Al igual que con los vectores, también podemos mandar a llamar las entradas del array indicando dentro de corchetes los índices. Si una dimensión se omite, R lo interpreta como que se piden todos los elementos de esa dimensión.
## [1] 7
## [1] 1 7 13 19 25 31 37 43 49 55
Un array puede utilizar también otro array de índices, tanto para asignar un vector a una colección irregular de elementos de un array como para extraer una colección irregular de elementos.
## [,1] [,2]
## [1,] 1 1
## [2,] 2 2
## [3,] 3 3
## [4,] 4 4
## [5,] 5 5
## [6,] 6 6
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 0 7 13 19 25 31 37 43 49 55
## [2,] 2 0 14 20 26 32 38 44 50 56
## [3,] 3 9 0 21 27 33 39 45 51 57
## [4,] 4 10 16 0 28 34 40 46 52 58
## [5,] 5 11 17 23 0 35 41 47 53 59
## [6,] 6 12 18 24 30 0 42 48 54 60
También podemos modificar manualmente las entradas del array de la siguiente forma.
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 0 7 13 19 25 31 37 43 49 55
## [2,] 2 0 14 20 26 32 38 44 50 0
## [3,] 3 9 0 21 27 33 39 45 0 57
## [4,] 4 10 16 0 28 34 40 0 52 58
## [5,] 5 11 17 23 0 35 0 47 53 59
## [6,] 6 12 18 24 30 0 42 48 54 60
La función which()
nos ayuda a recuperar los índices de un array que cumplan alguna condición. Su sintaxis es which(object, arr.ind = FALSE)
, donde object
es el objeto de donde se quiere recuperar los índices y arr.ind
se cambia a TRUE
si se requieren los índices multidimensionales.
## row col
## [1,] 1 1
## [2,] 2 2
## [3,] 3 3
## [4,] 4 4
## [5,] 5 5
## [6,] 6 6
## [7,] 5 7
## [8,] 4 8
## [9,] 3 9
## [10,] 2 10
Está función también se puede aplicar a vectores.
## Warning in log(c(1, -2, 3)): Se han producido NaNs
## [1] 0.000000 NaN 1.098612
## [1] 2
Las funciones y operaciones de los arrays son similares a las de los vectores.
## [1] 0.000000 1.414214 1.732051 2.000000 2.236068 2.449490
La función dimnames
es similar a la función names()
de los vectores. En el caso de arrays, dimnames
será una lista que debe contener tantos vectores como dimensiones tenga el array.
mi_array <- array(c(1:12), dim=c(2,2,3),
dimnames = list(c("Gato","Perro"),
c("Esterilizado", "No esterilizado"),
c("Morelia", "Patzcuaro", "Maravatio")))
mi_array
## , , Morelia
##
## Esterilizado No esterilizado
## Gato 1 3
## Perro 2 4
##
## , , Patzcuaro
##
## Esterilizado No esterilizado
## Gato 5 7
## Perro 6 8
##
## , , Maravatio
##
## Esterilizado No esterilizado
## Gato 9 11
## Perro 10 12
## [1] 3
## Morelia Patzcuaro Maravatio
## Esterilizado 2 6 10
## No esterilizado 4 8 12
Las funciones rbind()
y cbind()
sirven para combinar arrays vertical y horizontalmente.
mi_array1 <- array(c(1:6), dim = c(2,3))
mi_array2 <- array(c(7:18), dim = c(4,3))
mi_array3 <- array(c(19:29), dim = c(2,5))
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
## [3,] 7 11 15
## [4,] 8 12 16
## [5,] 9 13 17
## [6,] 10 14 18
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
## [1,] 1 3 5 19 21 23 25 27
## [2,] 2 4 6 20 22 24 26 28
2.5.3 Matrices
Las matrices son arreglos de dos dimensiones. Entonces, una forma de crear una matriz es usando la función array
pero especificando una dimensión de la forma dim=c(x,y)
.
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
Otra forma de crear matrices es usando la función matrix()
indicandole el número de columnas y/o filas.
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
## [1] "matrix" "array"
## [1] "matrix" "array"
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0 0 0 0 0
## [2,] 0 0 0 0 0
## [3,] 0 0 0 0 0
Otro parámetro que podemos darle a la función matrix
es byrow
, el cual nos ayuda a llenar la matrix por filas.
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
## [3,] 7 8 9
Como las matrices son un tipo particular de los arreglos, las funciones como dimnames
o extraer entradas y modificarlas funcionan de la misma forma.
#Ejercicio: Crea una matriz de tamaño 4x4 con números consecutivos ordenados
#por filas y extrae la entrada (4,2).
#cambia los nombres de las filas y columnas por caracteres
Disponemos también de varias operaciones con matrices. La operación \(A\ast B\) donde \(A\), \(B\) son matrices en R se refiere a la multiplicación entrada a entrada, no a la multiplicación de matrices. Además esta multiplicación solo se puede realizar si se tiene el mismo número de filas y de columnas.
## [,1] [,2] [,3]
## [1,] 1 8 21
## [2,] 8 25 48
## [3,] 21 48 81
La suma y resta de matrices se refiere a sumar o restar dos matrices entrada a entrada, solo se puede realizar con matrices de las mismas dimensiones.
## [,1] [,2] [,3]
## [1,] 2 6 10
## [2,] 6 10 14
## [3,] 10 14 18
## [,1] [,2] [,3]
## [1,] 0 2 4
## [2,] -2 0 2
## [3,] -4 -2 0
El operador en R para realizar la multiplicación usual de matrices es %*%
.
## [,1] [,2] [,3]
## [1,] 66 78 90
## [2,] 78 93 108
## [3,] 90 108 126
El operador t()
se usa para calcular la transpuesta de una matriz.
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
## [3,] 7 8 9
2.5.3.1 Otras operaciones con Matrices
- Crossproduct: es equivalente a
t(A)%*% B
oA %*% t(B)
. Las funciones que se usan soncrossprod
ytcrossprod
respectivamente.
## [,1] [,2]
## [1,] 125 60
## [2,] 220 96
## [,1] [,2]
## [1,] 74 198
## [2,] 61 147
- Producto exterior: El operador que se usa es
%o%
o la funciónouter()
.
## , , 1, 1
##
## [,1] [,2]
## [1,] 50 40
## [2,] 25 60
##
## , , 2, 1
##
## [,1] [,2]
## [1,] 150 120
## [2,] 75 180
##
## , , 1, 2
##
## [,1] [,2]
## [1,] 30 24
## [2,] 15 36
##
## , , 2, 2
##
## [,1] [,2]
## [1,] 60 48
## [2,] 30 72
## , , 1, 1
##
## [,1] [,2]
## [1,] 50 40
## [2,] 25 60
##
## , , 2, 1
##
## [,1] [,2]
## [1,] 150 120
## [2,] 75 180
##
## , , 1, 2
##
## [,1] [,2]
## [1,] 30 24
## [2,] 15 36
##
## , , 2, 2
##
## [,1] [,2]
## [1,] 60 48
## [2,] 30 72
- Producto Kronecker: si \(A\) y \(B\) son dos matrices, el producto de Kronecker se denota por $A B $ y en R el operador correspondiente es
%x%
.
## [,1] [,2] [,3] [,4]
## [1,] 50 30 40 24
## [2,] 150 60 120 48
## [3,] 25 15 60 36
## [4,] 75 30 180 72
- Potencia de una matriz: existen dos formas de realizarla. La primera es con el operador
%^%
del paqueteexpm
. La segunda con la funciónmatrix.power
del paquetematrixcalc
.
## Loading required package: Matrix
##
## Attaching package: 'expm'
## The following object is masked from 'package:Matrix':
##
## expm
## [,1] [,2]
## [1,] 140 176
## [2,] 110 184
## [,1] [,2]
## [1,] 140 176
## [2,] 110 184
- Determinante: la función de R que calcula el determinante de una matriz es
det()
.
## [1] 80
## [1] -15
- Inversa: para calcular la inversa de una matriz se usa la función
solve()
.
## [,1] [,2]
## [1,] 0.1500 -0.100
## [2,] -0.0625 0.125
La función solve
también nos ayuda a resolver un sistema de ecuaciones, por ejemplo si queremos resolver el sistema de ecuaciones \(AX = B\) lo podemos hacer de la siguiente manera.
## [,1] [,2]
## [1,] -0.7500 -0.1500
## [2,] 1.5625 0.5625
- Rango: no existe una función base de R para calcular el rango pero se puede usar la función
qr()
que nos calcula la descomposición QR de una matriz y regresa también como argumento el rango de la matriz o la funciónrankMatrix
del paqueteMatrix
.
## $qr
## [,1] [,2]
## [1,] -11.1803399 -12.521981
## [2,] 0.4472136 7.155418
##
## $rank
## [1] 2
##
## $qraux
## [1] 1.894427 7.155418
##
## $pivot
## [1] 1 2
##
## attr(,"class")
## [1] "qr"
Para solo pedir a R el rango de la matriz se hace uso del operador $
de la siguiente manera.
## [1] 2
## [1] 2
- Matriz diagonal: La función
diag()
nos ayuda a extraer o reemplazar la diagonal de una matriz.
## [1] 10 12
Si el argumento que se le da a la función diag
es un vector, esto crea una matriz diagonal con las entradas del vector en la diagonal.
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 2 0
## [3,] 0 0 3
Además, la función diag
también nos permite crear una matriz identidad especificando solamente la dimensión de la matriz deseada.
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 1 0
## [3,] 0 0 1
- Eigenvalores y eigenvectores: la función de R que nos calcula tanto los eigenvalores como los eigenvectores es
eigen()
.
## eigen() decomposition
## $values
## [1] 17.403124 4.596876
##
## $vectors
## [,1] [,2]
## [1,] -0.7339565 -0.8286986
## [2,] -0.6791964 0.5596952
2.5.4 Dataframes
Los dataframes o tablas de catos son un arreglo rectangular de datos y son los objetos más usados en R al momento de realizar análisis de datos. En los vectores, arreglos y matrices, todas las entradas tienen que ser el mismo tipo de dato pero en los dataframes no es necesario pero cada columna si debe de tener el mismo tipo de datos.
Para crear un dataframe usamos la función data.frame()
, a diferencia de los arrays, uno debe especificar cada columna con su nombre. Los nombres de las columnas no deben de contener espacios.
mi_df <- data.frame(ciudad = c("Morelia", "Veracruz", "Merida"),
Temperatura = c(27, 26, 32),
Playa = c(FALSE, TRUE, FALSE))
mi_df
## ciudad Temperatura Playa
## 1 Morelia 27 FALSE
## 2 Veracruz 26 TRUE
## 3 Merida 32 FALSE
Todas las columnas de un dataframe deben de tener la misma longitud. La función str()
nos permite ver como están estructurados nuestros datos, no solamente un dataframe.
## 'data.frame': 3 obs. of 3 variables:
## $ ciudad : chr "Morelia" "Veracruz" "Merida"
## $ Temperatura: num 27 26 32
## $ Playa : logi FALSE TRUE FALSE
En los dataframes, las filas también pueden tener un nombre, para darles nombre usamos la función row.names()
.
## ciudad Temperatura Playa
## A Morelia 27 FALSE
## B Veracruz 26 TRUE
## C Merida 32 FALSE
El comando row.names()
se puede dar como atributo cuando se construye el dataframe.
mi_df <- data.frame(ciudad = c("Morelia", "Veracruz", "Merida"),
Temperatura = c(27, 26, 32),
Playa = c(FALSE, TRUE, FALSE),
row.names = c("A", "B", "C"))
mi_df
## ciudad Temperatura Playa
## A Morelia 27 FALSE
## B Veracruz 26 TRUE
## C Merida 32 FALSE
Para acceder a los datos del dataframe es similar a la forma de los arreglos o vectores y además podemos mandar a llamar solo una columna usando el operador $
.
## [1] "Morelia" "Veracruz" "Merida"
## [1] 27 26 32
## ciudad Temperatura Playa
## A Morelia 27 FALSE
## B Veracruz 26 TRUE
## ciudad Temperatura Playa
## A Morelia 27 FALSE
## B Veracruz 33 TRUE
## C Merida 32 FALSE
Una forma de modificar el nombre de una columna de nuestro dataframe es con la función names
.
## Ciudad Temperatura Playa
## A Morelia 27 FALSE
## B Veracruz 33 TRUE
## C Merida 32 FALSE
Las funciones rbind
cbind
que usamos con los arreglos también se pueden usar para expandir los dataframes.
## c..Monterrey....Cancún.. c.25..28. c.FALSE..TRUE.
## 1 Monterrey 25 FALSE
## 2 Cancún 28 TRUE
Al no tener los mismos nombres de columnas, no se puede usar rbind
para combinarlos. Esto se puede solucionar cambiando los nombres del segundo dataframe.
## [1] "c..Monterrey....Cancún.." "c.25..28."
## [3] "c.FALSE..TRUE."
## [1] "Ciudad" "Temperatura" "Playa"
## Ciudad Temperatura Playa
## A Morelia 27 FALSE
## B Veracruz 33 TRUE
## C Merida 32 FALSE
## 1 Monterrey 25 FALSE
## 2 Cancún 28 TRUE
Con cbind
no tenemos este problema ya que lo que hacemos es agregar columnas.
## Ciudad Temperatura Playa Habitantes
## A Morelia 27 FALSE 849053
## B Veracruz 33 TRUE 8063000
## C Merida 32 FALSE 892363
Otra forma de agregar una columna es con el operador $
.
## Ciudad Temperatura Playa Habitantes
## A Morelia 27 FALSE 849053
## B Veracruz 33 TRUE 8063000
## C Merida 32 FALSE 892363
El operador $
también nos sirve para eliminar una columna.
## Ciudad Temperatura Playa
## A Morelia 27 FALSE
## B Veracruz 33 TRUE
## C Merida 32 FALSE
Para guardar un dataframe usamos la función write.csv
.
Para leer el csv que acabamos de guardar usamos la función reaf.csv
.
## Ciudad Temperatura Playa
## 1 Morelia 27 FALSE
## 2 Veracruz 33 TRUE
## 3 Merida 32 FALSE
## NULL
2.5.5 Listas
Las listas son objetos ordenados de una solo longitud y sus elementos pueden ser de distinto tipo, incluso otras listas. La función para crear listas es list()
.
## [[1]]
## [1] 1
##
## [[2]]
## [1] "a"
##
## [[3]]
## [1] TRUE
## [1] "list"
## [1] "list"
Para acceder a los elementos de una lista es similar a la de los vectores e incluso se le puede dar nombres a las entradas o modificarlos como con los vectores usando la función names()
.
mi_lista2 <- list(mi_vector = c(1,2,3,4),
mi_array = array(c(1:9),dim=c(3,3)),
mi_booleano = TRUE)
mi_lista2
## $mi_vector
## [1] 1 2 3 4
##
## $mi_array
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
##
## $mi_booleano
## [1] TRUE
## [1] "mi_vector" "mi_array" "mi_booleano"
## [1] "mi_vector" "mi_array" "mi_logico"
No es necesario que todas las entradas de la lista tengan los mismos nombres.
## [1] "" "letra" ""
La función length()
nos devuelve la dimensión de una lista.
## [1] 3
## [1] 3
Con la función srt()
podemos conocer la estructura de la lista.
## List of 3
## $ mi_vector: num [1:4] 1 2 3 4
## $ mi_array : int [1:3, 1:3] 1 2 3 4 5 6 7 8 9
## $ mi_logico: logi TRUE
A diferencia de los vectores y arrays, en las listas contamos con dos niveles de indexado. Con dobles corchetes accedemos a los elementos de la lista, es decir [[n]]
nos devuelve el elemento \(n\) de la lista y en caso de que se trate de un array, vector u otro objeto para acceder a los elementos de este objeto usamos otros corchetes, es decir objeto[[n]][p]
.
# Para acceder a la primera fila de la segunda entrada de la lista, la cual es
# un array usamos:
mi_lista2[[2]][1,]
## [1] 1 4 7
## [1] "matrix" "array"
## $mi_array
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
## [1] "list"
Otra forma de acceder a los objetos de la lista es usando sus nombres o con el operador $
como en los dataframes.
## $mi_vector
## [1] 1 2 3 4
## [1] 1 2 3 4
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
Para añadir elementos a una lista debemos ser cuidadosos con los índices que usamos, si usamos [[k]]
estaríamos añadiendo un objeto en la posición \(k\) de la lista y si usamos [[k]][j]
estaríamos añadiendo el elemento \(j\) al objeto \(k\) de la lista.
## [[1]]
## [1] 1
##
## [[2]]
## [1] "a"
##
## [[3]]
## [1] TRUE
##
## [[4]]
## [1] "a" "b" "c"
## [[1]]
## [1] 1 2
##
## [[2]]
## [1] "a"
##
## [[3]]
## [1] TRUE
##
## [[4]]
## [1] "a" "b" "c"
Para eliminar elementos de una lista podemos asignar NULL
a la posición de la lista, sin embargo esta asignación no hace diferencia de si usamos [[]]
, []
o $
.
## [[1]]
## [1] 1 2 3 4
##
## [[2]]
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
##
## [[3]]
## [1] TRUE FALSE
## [[1]]
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
##
## [[2]]
## [1] TRUE FALSE
mi_lista4 <- list(c(1,2,3,4),array(c(1:4),dim = c(2,2)), c(TRUE,FALSE))
mi_lista4[[1]] <- NULL
mi_lista4
## [[1]]
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
##
## [[2]]
## [1] TRUE FALSE
mi_lista4 <- list(mi_vec = c(1,2,3,4),mi_array = array(c(1:4),dim = c(2,2)), mi_log = c(TRUE,FALSE))
mi_lista4[["mi_array"]] <- NULL
mi_lista4
## $mi_vec
## [1] 1 2 3 4
##
## $mi_log
## [1] TRUE FALSE
mi_lista4 <- list(mi_vec = c(1,2,3,4),mi_array = array(c(1:4),dim = c(2,2)), mi_log = c(TRUE,FALSE))
mi_lista4["mi_array"] <- NULL
mi_lista4
## $mi_vec
## [1] 1 2 3 4
##
## $mi_log
## [1] TRUE FALSE
mi_lista4 <- list(mi_vec = c(1,2,3,4),mi_array = array(c(1:4),dim = c(2,2)), mi_log = c(TRUE,FALSE))
mi_lista4$mi_array <- NULL
mi_lista4
## $mi_vec
## [1] 1 2 3 4
##
## $mi_log
## [1] TRUE FALSE
mi_lista4 <- list(mi_vec = c(1,2,3,4),mi_array = array(c(1:4),dim = c(2,2)), mi_log = c(TRUE,FALSE))
mi_lista4[c(1,3)] <- NULL
mi_lista4
## $mi_array
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
mi_lista4 <- list(mi_vec = c(1,2,3,4),mi_array = array(c(1:4),dim = c(2,2)), mi_log = c(TRUE,FALSE))
mi_lista4[-c(1,3)]
## $mi_array
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
Para combinar dos listas usamos el operador que se usa para concatenar vectores c()
.
## [[1]]
## [1] 1 2 3
##
## [[2]]
## [1] "a" "b"
##
## [[3]]
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
##
## [[4]]
## [1] TRUE FALSE
## [1] "list"
2.5.6 Factores
Los factores nos ayudan a representar los niveles de los datos, pueden parecer caracteres pero en realidad son niveles. Por ejemplo, se pueden usar para representar el género, continentes, razas de algún animal, etc.
## chr [1:4] "Siames" "Calico" "Angora" "Carey"
## [1] "factor"
## Factor w/ 4 levels "Angora","Calico",..: 4 2 1 3
## [1] "character"
## [1] "integer"
Para conocer los niveles de nuestro objeto usamos la función levels()
y cuantos niveles tenemos nlevels()
.
## [1] "Angora" "Calico" "Carey" "Siames"
## [1] 4
Los factores se ordenan alfabéticamente.
## [1] alto medio bajo
## Levels: alto bajo medio
## [1] alto medio bajo
## Levels: bajo < medio < alto
niveles2 <- factor(niveles, order = TRUE, levels = c("bajo", "medio", "alto"))
niveles2; as.numeric(niveles2)
## [1] alto medio bajo
## Levels: bajo < medio < alto
## [1] 3 2 1
2.5.7 Atributos de objetos
Los atributos de los objetos los podemos obtener de la siguiente forma:
- Modo: Cualquier tipo de entidad que maneja R, se usa la función mode(objeto)
.
- Tipo: Tipo de dato: entero, caracter, double, etc. Se usa la función typeof(objeto)
.
- Nombres: etiquetas de los elementos individuales de un vector o lista. Se usa la función names(objeto)
.
- Dimensiones: Dimensión de los arreglos. Se usa la función dim(objeto)
. Esta función devuelve dos valores: el primero es el número de filas, el segundo el de columnas.
- Dimnames: Nombres de las dimensiones de los arrays. Se usa la función dimnames(objeto)
.
- Clase: Vector alfanumérico con la lista de las clases del objeto. Se usa la función class(objeto)
.
- Longitud: Longitud de cualquier estructura. Se usa la función length(objeto)
.
## [1] "character"
El operador ls()
nos permite listar todas las variables y funciones de nuestro ambiente global, sin embargo los objetos que comienzan con .
no son listados, para listar estas variables se utiliza ls(all.names = TRUE)
.
## [1] "A" "B" "categorias_gatos"
## [4] "clases" "gatos" "indices"
## [7] "info_extra" "lista1" "lista2"
## [10] "lista3" "Logaritmo" "matriz_ceros"
## [13] "matriz1" "matriz2" "matriz3"
## [16] "mi_array" "mi_array1" "mi_array2"
## [19] "mi_array3" "mi_df" "mi_lista"
## [22] "mi_lista2" "mi_lista3" "mi_lista4"
## [25] "mi_vector" "mi_vector2" "mis_calificaciones"
## [28] "municipios" "niveles" "niveles2"
## [31] "nuevo_df" "raiz_x" "w"
## [34] "workingDir" "x" "y"
## [37] "z"
Para borrar un objeto usamos rm(objeto)
.
En el caso de querer eliminar todos los objetos de nuestro ambiente, usamos rm(list = ls() )
. Es importante señalar que se debe usar el operador =
para asignar al objeto list
todos los objetos que estén en ls()
en lugar del operador <-
.
2.5.8 Ejercicios
- Crea una base de datos de los asistentes a la clase y dale el nombre
estudiantes
, almacena datos como nombre, edad, lugar de origen, grado, o algunos otros de tal forma que la base de datos tenga variables de todos los tipos, numéricos, factores, lógicos y caracteres.
- Usando la base de datos estudiantes, extrae las columnas de los estudiantes con edad mayor al promedio de las edades y aquellos estudiantes del mismo grado.
- Extrae las ciudades o regiones de aquellos estudiantes mayores a la edad promedio.
- Ordena la base de datos usando alguna variable cuantitativa.
- Crea una lisa con los elementos de la base de datos estudiantes y da un nombre a las entradas de la lista y accede a tu nombre y edad como subelementos de la lista.
Usando la ayuda de R, busca como se pueden redondear los números \(2.5\), \(4.8\), \(9,2\). ¿Cuáles fueron los resultados de redondear? Ahora, trata de redondear a dos decimales los siguientes números: \(4.765\), \(3.231\), \(9.769\).
Crea una vector con las letras
A M A B M M B A B B
, dondeA
significa Alto,B
bajo yM
medio. Convierte las entradas del vector a factores y especifica queA > M > B
.Carga la base de datos
CO2
del paquetedatasets
usandodata("CO2")
. Explora la base de datos y revisa que tipo de datos tiene cada columna.
- Calcula el promedio de las tasas de absorción de CO2 en Quebec (
uptake
). - Obtén el máximo y mínimo de las concentraciones de CO2 para las plantas
chilled
. - Para las plantas
Ms2
, ¿cuántos niveles de concentración ambiental de CO2 se midieron?. - Para plantas
non-chilled
, cuando la concentración es 500, ¿cuáles son los niveles de absorciónuptake
?
2.6 Estructuras de control
Las estructuras de control se refieren a como hacemos que un algoritmo tome alguna decisión o camino dependiendo de las condiciones que se le especifiquen y realice ciclos o repeticiones.
Vamos a ver dos tipos de estructuras de control. La primera el condicional if
donde ciertas instrucciones son ejecutadas dada la veracidad de la condición que actúa como un parámetro de control. La segunda se trata de los ciclos, los cuales repiten ciertas instrucciones varias veces, de este tipo de estructuras de control tenemos el ciclo for
que se usa cuando las repeticiones se realizan un número fijo de veces (el parámetro de control) y el ciclo while
cuando las iteraciones no se especifican a priori pero continua evaluándose mientras alguna condición no se alcance.
2.6.1 Condicional if
La palabra clave if
siempre evalúa una expresión lógica y cuando dicha expresión de por resultado el valor TRUE
, se ejecutará el código indicado a continuación del if
entre llaves. En caso de que el resultado sea FALSE
, ignorará lo que se encuentre inmediatamente del if
entre llaves y continuará con la siguiente instrucción.
# if
if (condicion es TRUE) {
instrucción
}
# if ... else
if (condicion es TRUE) {
instrucción
} else {
instruccion alternativa
}
# if ... else if ... else
if (condicion es TRUE) {
instrucción
} else if (condicion es TRUE) {
instruccion alternativa
} else {
ultima condicion
}
Por ejemplo, vamos a crear una variable y asignarle un valor, después vamos imprimir en pantalla si la variable tiene cierto valor.
## [1] 8
Como \(x\) no es más grande que 10, entonces no nos devuelve ningún mensaje.
## [1] " x es menor que 10"
## [1] 8
Para verificar varias condiciones podemos usar else if
x <- 8
if (x >= 10) {
print(" x es más grande o igual a 10")
} else if (x > 5) {
print("x es mayor que 5 pero menor que 10")
} else {
print(" x es menor que 10")
}
## [1] "x es mayor que 5 pero menor que 10"
## [1] 8
edad <- readline(prompt = "Escribe tu edad:")
if (edad >= 30 ) {
print("Tal vez tenemos la misma edad")
} else{
print("Soy mayor que tu")
}
# Ejercicio: crea un ciclo if que pregunte un número y que devuelva el mensaje de si el número es positivo, negativo o cero.
También se pueden crear ciclos anidados.
dato_texto = readline(prompt="Ingresa un número: ")
dato <- as.numeric(dato_texto)
if(is.na(dato) == FALSE){
print('Es un número.')
if(dato < 0){
print('Es negativo.')
} else if(dato > 0){
print('Es positivo.')
} else{
print('Es cero')
}
} else{
print('No es un número.')
}
Existe una función adicional llamada ifelse()
, la estructura de esta es ifelse(condicion is TRUE, instruccion1, instruccion alternativa)
.
## [1] "x es un número negativo"
Tres funciones que son de gran ayuda para verificar condiciones son all()
, any()
, which()
.
## [1] FALSE
## [1] TRUE
## [1] 1 7
2.6.2 Ciclo for
La función for()
realiza un bloque de códigos tantas veces como se indique un argumento. Los objetos de tipo iterable, es decir los que se pueden recorrer son los vectores y las listas. La sintaxis de un for
es la siguiente:
El vector de índices se define antes de las instrucciones entre {}
o dentro de los ()
. Por ejemplo,
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
Al terminar el ciclo for()
, el valor de la varible i
toma el último valor de la lista de índices.
## [1] 10
Vamos a crear un vector vacío y que después se rellene con la suma acumulativa de los enteros consecutivos en el vector.
## NULL
## [1] 1 3 6 10 15 21 28 36 45 55
## [1] 1
## [1] 3
## [1] 5
## [1] 7
## [1] 9
## [1] 11
## [1] 13
## [1] 15
## [1] 17
## [1] 19
También se pueden usar valores lógicos como sigue.
## [1] TRUE
## [1] FALSE
## [1] TRUE
Las estructuras de control se pueden combinar. Por ejemplo, vamos a crear un condicional con un for
y un if
que nos regrese el mensaje de si un estudiante alcanzó al menos 5 puntos en un examen.
puntos <- c(10,4, 6,2,4, 7, 5, 9, 8, 0)
for (puntaje in puntos){
if (puntaje < 5 ){
print("Reprobó")
} else {
print("Aprobó")
}
}
## [1] "Aprobó"
## [1] "Reprobó"
## [1] "Aprobó"
## [1] "Reprobó"
## [1] "Reprobó"
## [1] "Aprobó"
## [1] "Aprobó"
## [1] "Aprobó"
## [1] "Aprobó"
## [1] "Reprobó"
2.6.3 Ciclo while
El ciclo while()
se usa para realizar un bloque de código recursivamente mientras no se alcance cierta condición. Si el resultado de la evaluación es FALSE
entonces no se realizará la instrucción. La estructura del condicional while()
es como sigue.
El siguiente ejemplo imprime en pantalla un número mientras este no sea mayor a 10.
## [1] "0" "es menor a 10"
## [1] "1" "es menor a 10"
## [1] "2" "es menor a 10"
## [1] "3" "es menor a 10"
## [1] "4" "es menor a 10"
## [1] "5" "es menor a 10"
## [1] "6" "es menor a 10"
## [1] "7" "es menor a 10"
## [1] "8" "es menor a 10"
## [1] "9" "es menor a 10"
Igual que con el condicional for()
, i
es una variable que al finalizar el ciclo tiene el último valor con el que fue evaluada, en este caso:
## [1] 10
Se debe de tener cuidado de modificar el valor de la variable a iterar para no terminar con un condicional infinito.
El siguiente ciclo nos devuelve el primer número cuyo cuadrado exceda el número dado.
## [1] 45
Los while()
se pueden emplear con caracteres.
frase <- "Hola a todos"
n=1
lista <- list()
while (n <= nchar(frase)) {
lista[[n]] = list(recorridos = substr(frase,1, n), num_caracteres = n)
n = n + 1
}
lista
## [[1]]
## [[1]]$recorridos
## [1] "H"
##
## [[1]]$num_caracteres
## [1] 1
##
##
## [[2]]
## [[2]]$recorridos
## [1] "Ho"
##
## [[2]]$num_caracteres
## [1] 2
##
##
## [[3]]
## [[3]]$recorridos
## [1] "Hol"
##
## [[3]]$num_caracteres
## [1] 3
##
##
## [[4]]
## [[4]]$recorridos
## [1] "Hola"
##
## [[4]]$num_caracteres
## [1] 4
##
##
## [[5]]
## [[5]]$recorridos
## [1] "Hola "
##
## [[5]]$num_caracteres
## [1] 5
##
##
## [[6]]
## [[6]]$recorridos
## [1] "Hola a"
##
## [[6]]$num_caracteres
## [1] 6
##
##
## [[7]]
## [[7]]$recorridos
## [1] "Hola a "
##
## [[7]]$num_caracteres
## [1] 7
##
##
## [[8]]
## [[8]]$recorridos
## [1] "Hola a t"
##
## [[8]]$num_caracteres
## [1] 8
##
##
## [[9]]
## [[9]]$recorridos
## [1] "Hola a to"
##
## [[9]]$num_caracteres
## [1] 9
##
##
## [[10]]
## [[10]]$recorridos
## [1] "Hola a tod"
##
## [[10]]$num_caracteres
## [1] 10
##
##
## [[11]]
## [[11]]$recorridos
## [1] "Hola a todo"
##
## [[11]]$num_caracteres
## [1] 11
##
##
## [[12]]
## [[12]]$recorridos
## [1] "Hola a todos"
##
## [[12]]$num_caracteres
## [1] 12
2.7 Funciones y Operadores
En R al igual que en otros lenguajes de programación podemos crear nuestras propias funciones.
La estructura de una función en R es la siguiente:
Por ejemplo, supongamos que necesitamos calcular repetidamente el valor de la función \(f(x)=x^2/(x-1)\).
Entonces para evaluarla en algún número solo usamos la intrucción:
## [1] 6.25
Supongamos que dado un vector, queremos calcular la suma de sus entradas, restarle el elemento máximo y el mínimo.
mi_funcion <- function(vec){
suma <- sum(vec)
maximo <- max(vec)
minimo <- min(vec)
return(suma - maximo - minimo)
}
Aplicamos la función a un vector:
## [1] 17
En las funciones podemos indicar la operación a realizar como en el ejemplo uno o escribir la palabra reservada return
para que nos regrese ese resultado.
Las funciones pueden recibir más de un parámetro como en el caso de funciones matemáticas en dos o más variables. Por ejemplo, supongamos que queremos crear la función \(g(x,y)= x^2 - y^2\).
## [1] 3
A las funciones también podemos pasarle parámetros opcionales como en otras funciones que ya hemos utilizado como matrix
. Por ejemplo, supongamos que queremos crear una función que nos cree vectores o matrices dependiendo de los parámetros que le proporcionemos.
Por ejemplo, le podemos dar solo el parámetro a:
## [1] 1 2 3 4
Y es lo mismo a indicar el parámetro a
y flag=FALSE
:
## [1] 1 2 3 4
En cambio, si cambiamos el parámetro de flag=TRUE
:
## [,1] [,2]
## [1,] 1 5
## [2,] 2 6
## [3,] 3 7
## [4,] 4 8
Si no queremos proporcionar el parámetro b
pero si queremos una matriz debemos especificar que TRUE
es el valor de flag
:
## [,1] [,2] [,3] [,4]
## [1,] 1 3 5 7
## [2,] 2 4 6 8
Una función en R solo puede regresar un objeto pero si queremos que nos regrese más de un objeto podemos usar listas para almacenar los resultados.
## $len
## [1] 10
##
## $total
## [1] 55
##
## $promedio
## [1] 5.5
## [1] "len" "total" "promedio"
## [1] 10
En el caso de que queramos obtener algún mensaje de error cuando el argumento de nuestra función no sea lo esperado podemos usar la función stop
.
fxx <- function(x){
if (!is.numeric(x)){
stop("x debe ser un número")
}
result <- (x*x)/(x-1)
return(result)
}
Otro argumento que funciona de forma similar a stop
es stopifnot()
, este se usa en el caso de que no se quieran verificar varias condiciones.
2.7.1 Ejercicios
Crea un vector que contenga los 7 días de la semana. Haz una función que dado un número del 1 al 7, imprima el día de la semana correspondiente.
Crea una función que dado un número del 1 al 12 imprima el nombre del mes correspondiente.
Crea una función que calcule las raices de un polinomio cuadrático.
Considera la función
Aplícala a: g(1 : 2, 2 : 3)
y g(1 : 4, 1 : 5)
. ¿Qué está realizando la función al aplicarla a datos?
- Escribe una función que tome cualquier dataframe con entradas numéricas y nos devuelva el mismo dataframe con un renglón con el promedio de cada columna.
2.8 Scripts
Un script es una colección de varias instrucciones de R escritas en un archivo. La extensión de los script en R es .r
o .R
. En los scripts podemos colocar comentarios, paquetes, instrucciones de tal forma que pueda ser ejecutado sin problemas. Para ejecutar un script usamos la instrucción source("nombre.R")
, en caso de no estar el script en nuestro directorio de trabajo debemos fijarlo o poner la ruta completa al script.
Por ejemplo, vamos a crear un script llamado mi_script.R
con dos variables y que calcule su producto. Para ejecutar el script vamos a escribir en la consola source("mi_script.R")
.
Nota: Para desinstalar algún paquete o instalar un paquete indicando que se instalen todas las dependencias se realizar lo siguiente: