Programación en R
5 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.
5.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). 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
}
A continuación se presenta un ejemplo de cómo usar la función mean para
calcular un promedio.
notas <- c(4.0, 1.3, 3.8, 2.0) # Notas de un estudiante
mean(notas)
## [1] 2.775
5.2 Asignación en R
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
Aunque una asignación se puede hacer de tres formas diferentes, se
recomienda sólo usar el símbolo <-.
5.3 Operadores
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. Los operadores binarios son también
funciones.
+ 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.
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
5.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.
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.
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
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.
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.
5.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 # Disyunción entre x e 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 &.
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
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
condiciones 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
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.
5.6 Funciones sobre vectores
En R podemos 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.
[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
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.
5.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
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
abs(2.5)
## [1] 2.5
abs(-3.6)
## [1] 3.6
5.8 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
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
5.9 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
ingresando número por número.
1 2 3 4 1 234
1 1 2 2 3 344
1 1 2 3 3 4
1 1 2 2 3 344
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
5.10 Funciones round, ceiling, floor y tr
unc
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 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)
## [1] -4
floor(x)
## [1] -5
trunc(x)
## [1] -4
5.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.
sort(x, decreasing = FALSE)
rank(x)
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.
Ejemplo
Considere el vector x que tiene los siguientes elementos: 2, 3, 6, 4, 9 y 5.
Ordene el vector de menor a mayor, de mayor a menor y por último
encuentre la posición que ocupan los elementos de x si se ordenaran de
menor a mayor.
x <- c(2, 3, 6, 4, 9, 5)
sort(x)
## [1] 2 3 4 5 6 9
sort(x, decreasing=TRUE)
## [1] 9 6 5 4 3 2
rank(x)
## [1] 1 2 5 3 6 4
EJERCICIOS
Use funciones o procedimientos (varias líneas) de R para responder cada
una de las siguientes preguntas.
1. ¿Qué cantidad de dinero sobra al repartir 10000$ entre 3 personas?
2. ¿Es el número 4560 divisible por 3?
3. Construya un vector con los números enteros del 2 al 87. ¿Cuáles de
esos números son divisibles por 7?
4. Construya dos vectores, el primero con los números enteros desde 7
hasta 3, el segundo vector con los primeros cinco números positivos
divisibles por 5. Sea A la condición de ser par en el primer vector. Sea
B la condición de ser mayor que 10 en el segundo vector. ¿En cuál de
las 5 posiciones se cumple A y B simultáneamente?
5. Consulte este enlace en el cual hay una anéctoda de Gauss niño. Use
R para obtener el resultado de la suma solicitada por el profesor del
niño Gauss.
6. Construya un vector con los siguientes elementos: 1, -4, 5, 9, -4.
Escriba un procedimiento para extraer las posiciones donde está el
valor mínimo en el vector.
7. Calcular 8!8!
9. Evaluar la siguiente productoria ∏i=10i=1log√ i ∏𝑖=1𝑖=10log𝑖
8. Evaluar la siguiente suma ∑i=7i=3ei∑𝑖=3𝑖=7𝑒𝑖
[Link] un vector cualquiera e inviertalo, es decir, que el primer
elemento quede de último, el segundo de penúltimo y así
sucesivamente. Compare su resultado con el de la función rev.
[Link] the vector: 1,2,3,…,19,201,2,3,…,19,20.
[Link] the vector: 20,19,…,2,120,19,…,2,1.
[Link] the vector: 1,−2,3,−4,5,−6,…,19,−201,−2,3,−4,5,−6,
…,19,−20.
[Link] the
vector: 0.13,0.21,0.16,0.24,...,0.136,0.2340.13,0.21,0.16,0.24
,...,0.136,0.234.
[Link] the
following: ∑100i=10(i3+4i2)∑𝑖=10100(𝑖3+4𝑖2) and ∑25i=1(2ii+3ii2
)∑𝑖=125(2𝑖𝑖+3𝑖𝑖2).
[Link] the data set available
in: [Link]
[Link] a code to obtain the number of variables of the data set.
[Link] a code to obtain the number of countries in the data set.
[Link] is the country with the higher population?
[Link] is the country with the lowest literacy rate?
21.¿Qué valor de verdad tiene la siguiente afirmación? “Los resultados de
la función floor y trunc son siempre los mismos”.
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.
[Link] que tengan un rendimiento menor a 18 millas por galón de
combustible.
[Link] que tengan 4 cilindros.
[Link] que pesen más de 2500 libras y tengan transmisión manual.