8 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.
8.1 ¿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).

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.
## [1] 2.775
# Es importante revisar los parametos de la función mean()
?mean
notas <- c(4.0, 1.3, 3.8, NA)
mean(notas)
## [1] NA
## [1] 3.033333
8.2 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 recomendado. -
->
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
<-
.
8.3 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. -
%/%
operador binario para obtener el cociente en una división (número entero). -
%%
operador binario para obtener el residuo en una división. -
¨%*%
operador binario para el producto suma de dos matrices
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
a %*% b
## [,1]
## [1,] 4
8.4 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.
-
!=
para saber si un número es diferente 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
a !=b # Si a es diferente de b
## [1] TRUE TRUE TRUE
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 crea 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.
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
Se retoma el data.fram mimarco
construído en la sección 3 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óna anterior usando el siguiente código.
mimarco <- data.frame(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 superior 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[,]
, entregará 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.
mimarco$edad >= 15
se debe ubicar antes de la coma para obtener todos individuos que cumplen con la condición.
8.5 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
x < 4 & y > 5 # Conjunción entre las pruebas anteriores.
## [1] FALSE TRUE FALSE
x < 4 && y > 5 # Conjunción vectorial (Se usa para evaluar circuitos)
## Warning in x < 4 && y > 5: 'length(x) = 3 > 1' in coercion to 'logical(1)'
## [1] FALSE
((-2:2) >= 0) & ((-2:2) <= 0)
## [1] FALSE FALSE TRUE FALSE FALSE
((-2:2) >= 0) && ((-2:2) <= 0)
## Warning in ((-2:2) >= 0) && ((-2:2) <= 0): 'length(x) = 5 > 1' in coercion to 'logical(1)'
## [1] FALSE
Notese 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
Se toma el data.frame mimarco
construído en la sección 3 y 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 condiciones simultáneamente, aquellos con edad \(\geq\) 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.
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
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
.
8.6 Funciones sobre vectores
En R se puede destacar las siguientes funciones básicas sobre vectores numéricos.
-
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.
-
which.min
: nos entrega la posición en donde está el valor mínimo del vector.
-
which.max
: 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, na.rm=TRUE) # Usamos na.rm = TRUE para remover el NA
## [1] 0
max(myvec, na.rm=T) # Para obtener el valor máximo
## [1] 9
range(myvec, na.rm=T) # Genera min y max simultáneamente
## [1] 0 9
sum(myvec, na.rm=T) # La suma de los valores internos
## [1] 28
prod(myvec, na.rm=T) # El productor de los valores internos
## [1] 0
which.min(myvec) # Posición del valor mínimo 0 en el vector
## [1] 6
which.max(myvec) # Posición del valor máximo 9 en el vector
## [1] 9
De las dos últimas líneas se puede destacar lo siguiente:
-
NO es necesario usar
na.rm = TRUE
para remover elNA
dentro de las funcioneswhich.min
niwhich.max
. - El valor mínimo 0 aparece en las posiciones 6 y 8 pero la función
which.min
sólo entrega la posición del primer valor mínimo dentro del vector.
8.7 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 continuació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)
## [1] 0.000000e+00 1.633124e+16 -1.224647e-16
Ejemplos de logaritmos
Ejemplos de exponencial
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
8.8 Función seq
En R se puede 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, length.out)
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. -
length.out
: 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 \(\pi\) 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, length.out = 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
:
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
8.9 Función rep
En R se puede crear repeticiones usando la función rep
, la estructura de esta función es:
rep(x, times = 1, length.out = NA, each = 1)
Los argumentos de esta función son:
-
x
: vector con los elementos a repetir. -
times
: número de veces que el vectorx
se debe repetir. -
length.out
: longitud deseada para el vector resultante. -
each
: número de veces que cada elemento dex
se debe repetir.
Ejemplo
Se constuyen las siguientes repeticiones usando la función rep
, no lo hagas ingresando número por número.
- 1 2 3 4 1 2 3 4
- 1 1 2 2 3 3 4 4
- 1 1 2 3 3 4
- 1 1 2 2 3 3 4 4
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.
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 = 4, each = 2)
## [1] 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
8.10 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 indicados. -
ceiling(x)
: entrega el mínimo entero mayor o igual quex
. -
floor(x)
: entrega el máximo entero menor o igual quex
. -
trunc(x)
: entrega la parte entera de un númerox
.
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.
8.11 Funciones sort
y rank
Las funciones sort
y rank
son útiles para ordenar los elementos de un vector o para saber las posiciones que ocuarían los elementos de un vector al ser ordenado. La estructura de las dos funciones es la siguiente.
En el parámetro x
se ingresa el vector y el parámetro decreasing
sirva para indicar si el ordenamiento es de menor a mayor (por defecto es este) o de mayor a menor.
8.12 Data sets
En R hay unas bases de datos incluídas, una de ellas es la base de datos llamada mtcars
. Para conocer las variables que están en mtcars
usted puede escribir en la consola ?mtcars
o también help(mtcars)
. De la base mtcars
obtenga bases de datos que cumplan las siguientes condiciones.
2# Funciones
Las funciones son fragmentos de código a los que se les da un nombre para que puedan usarse fácilmente varias veces. ¡Quizás sin darte cuenta, ya has usado funciones muchas veces!
8.13 Definición de la propia función
Una función se compone de los siguientes elementos:
un nombre: en R las funciones son objetos como vectores o matrices y se les da un nombre.
argumentos: estos son objetos que se utilizarán dentro de la función.
cuerpo: un fragmento de código que se ejecuta dentro de la función.
salida: un objeto que devuelve la función.
Consideremos un ejemplo sencillo.
my.function <- function(x,y){
z <- x + y
return(z)
}
La función anterior calcula la suma de dos números x
y y
. Llamémoslo.
my.function(2,3)
## [1] 5
Veamos el código línea por línea.
- En la primera línea, asignamos una función usando el comando function()
a un objeto llamado my.function
.
- my.function
tiene dos argumentos llamados x
y y
.
- Luego hay un corchete de apertura {
y la última línea de código tiene un corchete de cierre }
: lo que esté entre los dos corchetes es un fragmento de código que se ejecuta cuando se ejecuta la función.
- La segunda línea calcula una nueva variable llamada z
que almacena la suma de x
y y
.
- La tercera línea de código nos dice que la función debería regresar z
como salida.
Consideremos la función.
new.function <- function(x,y){
z1 <- x^2
z2 <- z1 + y
return(z2)
}
new.function(2,3)
## [1] 7
new.function(3,2)
## [1] 11
También se pueden almacenar los resultados en el enviroment
de R, para futuros cálculos.
value <- new.function(2,3)
value
## [1] 7
También si no se conocen todos los argumentos dentro las funciones de las paqueterías o creadas por otro usuario. Es necesario ser explicito en la entrada de los parametros, ya que muchas veces el orden influye en alguna funciones.
new.function(x = 2, y = 3)
## [1] 7
Las dos formas de especificar entradas dan exactamente los mismos resultados.