1 ¿Cómo funciona R?
2 Tipos de objetos
3 Operadores
4 Valores especiales y valores faltantes
5 Funciones
6 Ejercitación
7 Créditos
Bibliografía
Módulo 2: Conceptos básicos
de R
Curso - Introducción al programa R
1 ¿Cómo funciona R?
Antes de definir los distintos tipos de objetos vamos describir brevemente como
funciona R. R es un lenguaje orientado a objetos, lo que hace es aplicar funciones a
objetos (las funciones también son objetos). Básicamente, las funciones toman objetos
como insumos y los transforman en algo diferente.
1.1 Objetos
Cuando hablamos de objetos estamos haciendo referencia a cualquier cosa que existe en
R y que tiene un nombre. Los objetos almacenan datos o elementos. Es por ello, que
para hacer un uso eficiente de R es preciso conocer las distintas tipos o estructuras de
objetos que utiliza el programa. Dependiendo del tipo de objeto será la función que le
pueda aplicar.
1.2 Creación de objetos
Por ejemplo, creemos el objeto llamado x y le asignamos el valor 10. Escribe en tu
script el siguiente comando y ejecútalo:
# Creación del objeto x con valor 10
x <- 10
En la consola se mostrará el comando ejecutado (Figura 1.2.1):
Figura 1.2.1
Y en el environment va a aparecer el objeto creado (Figura 1.2.2):
Figura 1.2.2
En general, la asignación puede pensarse de la siguiente manera:
nombre_del_objeto <- valor_del_objeto
Hay que aclarar que al crear el objeto x igual a 10 escribimos dos líneas de códigos. La
primera que empieza con # se utiliza para hacer comentarios sobre el comando escrito
y, por lo tanto, lo que se encuentre a la derecha de este símbolo no se ejecutará. Los
comentarios no son obligatorios. La segunda línea de código es la creación del objeto.
Los nombres de los objetos no pueden incluir espacios y deben comenzar con una letra.
Debemos tener cuidado al uso de minúsculas o mayúsculas en los nombres de los
objetos ya que R es sensible a ellas. Es decir, el objeto x es diferente al X .
Si escribimos el nombre del objeto y lo ejecutamos nos muestra su contenido en la
consola (Figura 1.2.3). También se puede ver el contenido del objeto simplemente
escribiendo su nombre en el script y ejecutando esa línea de código (el resultado
aparece en la consola). En la imagen de la consola delante del valor del objeto entre
corchetes nos indica que es un vector donde 10 es su primer elemento.
Figura 1.2.3
También se pueden imprimir los objetos creados mediante la función print :
print(x)
[1] 10
2 Tipos de objetos
En R existen distintos tipos o estructuras de objetos: vectores, listas, matrices, funciones,
dataframes, etc. Desarrollaremos los más conocidos.
2.1 Vectores
El objeto x creado anteriormente es un vector numérico de una dimensión. Los
vectores contienen un conjunto de elementos ordenados de una dimensión, es decir,
solo una fila. Todos los elementos dentro del vector deben ser de la misma clase.
Mencionaremos 5 clases básicas de vectores:
1- Character (carácter): letras, palabras, o combinaciones de números, letras y distintos
caracteres especiales.
2- Numeric (numérico): números reales.
3- Integer (entero): números enteros.
4- Logical (lógico): FALSE (falso) o TRUE (verdadero).
5- Factor (factores): se emplea para registrar datos cualitativos. Se diferencia de la clase
character en que puede tomar un número limitado de opciones (niveles). Se utilizan
generalmente para clasificar los datos estableciendo la pertenencia a los grupos o
categorías determinados.
Para crear el vector, utilizamos la función c() . Lo que hace esta función combinar los
elementos que se coloquen como argumentos para conformar un vector. Cuando las
funciones contienen más de un argumento, estos se separan con comas.
Ejemplos:
# Vector character
vector_1 <- c("a", "abcv", "abc123", "Hola", "Hola_2")
En este tipo de vector los elementos deben estar entre comillas para indicar que son
caracteres (siendo indistinto el uso de comillas simples ' o dobles " ).
# Vector numeric (R utiliza el punto como separador decimal)
vector_2 <- c(10, 1.5, 0.34, 2000)
# Vector logical
vector_3 <- c(FALSE, TRUE, FALSE, TRUE)
# Vector factor
vector_4 <- factor(c( "H", "M", "H", "M", "M", "H"))
El vector anterior es un ejemplo en donde se indica el sexo de 6 personas, este puede ser
considerado de clase factor ya que establece para cada sujeto su pertenencia a una de
las dos categorías “Hombre” (H) o “Mujer” (M). Para que R reconozca al vector como
factor una vez introducidos los datos utilizamos la función factor .
Para ver los niveles de este vector simplemente visualizamos el vector:
vector_4
[1] H M H M M H
Levels: H M
Podemos comprobar de que clase es un objeto con la función class() .
class(vector_1)
[1] "character"
class(vector_2)
[1] "numeric"
class(vector_3)
[1] "logical"
class(vector_4)
[1] "factor"
Los números generalmente se tratan como si fueran objetos numéricos. Si creo por
ejemplo el vector con los números del 1 al 5 enumerando cada elemento y veo de qué
clase es veremos que es numérico:
# Vector con los números del 1 al 5
vector_a <- c(1, 2, 3, 4, 5)
class(vector_a)
[1] "numeric"
Esto significa que incluso si vemos un número como “1” o “2”, que podríamos
considerarlos números enteros, es probable que estén representados como objetos
numéricos (como “1,00” o “2,00”) esto no suele ser importante. Si quiero crear un vector
integer (de números enteros) hay varias formas de hacerlo, una de ellas es agregar la
letra L al final del número:
# Vector con los números enteros del 1 al 5
vector_b <- c(1L, 2L, 3L, 4L, 5L)
class(vector_b)
[1] "integer"
Otra cuestión a analizar es ver qué sucede si creamos un vector en dónde mezclamos
números y caracteres. Veamos un ejemplo:
vector_mix <- c(3, "hola")
vector_mix
[1] "3" "hola"
class(vector_mix)
[1] "character"
Los elementos de vector_mix son todos del tipo carácter indicado por las comillas (““)
alrededor de ellos en la salida. Esto sucede a pesar de que pusimos el número 3 (y
no”3”) al crear el vector. Lo que realiza R es forzar automáticamente la entrada de modo
que todos los elementos sean del mismo tipo. Por razones obvias, no se pueden
convertir caracteres a números, por lo que lo predeterminado es convertir el número a
carácter.
Otras formas de crear vectores
Para crear vectores con secuencias de números enteros puedo utilizar el operador : ,
veamos dos formas de hacerlo.
# Vector con los números del 1 al 10
vector_c <- c(1:10)
vector_c
[1] 1 2 3 4 5 6 7 8 9 10
# Vector con los números del 1 al 10
vector_d <- 1:10
vector_d
[1] 1 2 3 4 5 6 7 8 9 10
class(vector_c)
[1] "integer"
class(vector_d)
[1] "integer"
Otras funciones:
vector_5 <- seq(from = 4, to = 16, by = 2) # Secuencia desde 4 hasta 16 de a 2
vector_5
[1] 4 6 8 10 12 14 16
vector_6 <- seq(from = 4, to = 16) # Secuencia desde 4 hasta 16 de a 2. P
or default: by = 1
vector_6
[1] 4 5 6 7 8 9 10 11 12 13 14 15 16
vector_7 <- rep(x = 4.5, times = 3) # Repetición de valores (el número 4,5
tres veces)
vector_7
[1] 4.5 4.5 4.5
vector_8 <-rep(x = c(3, 2.7), times = 4) # Repetición de vectores
vector_8
[1] 3.0 2.7 3.0 2.7 3.0 2.7 3.0 2.7
En la mayoría de los casos se puede omitir escribir los nombres de los argumentos de
cualquier función de R. R generalmente puede determinar a qué corresponde cada
argumento con el orden de las entradas (debe revisarse la ayuda de cada función para
saber el orden de los mismos). En este sentido, el vector_5 podríamos crearlo de la
siguiente manera:
# Vector con los números del 1 al 10
vector_5b <- seq(4, 16, 2)
vector_5b
[1] 4 6 8 10 12 14 16
Otras funciones útiles
La función length() nos indica el número de elementos contenidos en un vector. Por
ejemplo:
# Número de elementos del vector vector_d:
length(vector_5b)
[1] 7
2.1.1 Acceso a los elementos de un vector
Puedo extraer el elemento de un vector que ocupa la posición j dentro de un vector v
refiriéndonos a él como v[j] . Por ejemplo, si tengo un vector con las alturas de un
grupo de 5 personas, podemos ver la altura del tercer elemento de la siguiente manera:
# Creo el vector con las alturas
altura <- c(1.8, 1.65, 1.76, 1.89, 1.7)
#Accedo al tercer elemento del vector
altura[3]
[1] 1.76
Se puede acceder simultáneamente a varios valores dentro de un vector. Por ejemplo, si
deseamos extraer del tercero al quinto del mismo vector:
altura[3:5]
[1] 1.76 1.89 1.70
Y si deseáramos obtener sólo los elementos primero, tercero y quinto:
altura[c(1,3,5)]
[1] 1.80 1.76 1.70
Para obtener las alturas que cumplan con el requisito de ser las mayores a 1,70 metros:
altura[altura>1.7]
[1] 1.80 1.76 1.89
2.1.2 Combinación de vectores
Se pueden crear vectores que sean combinación de otros vectores. Por ejemplo:
vector_4 <- c(vector_2, altura)
vector_4
[1] 10.00 1.50 0.34 2000.00 1.80 1.65 1.76 1.89 1.70
2.1.3 Vectorización de operaciones
Algunas operaciones podemos aplicarlas a un vector, es decir, a cada uno de sus
elementos. Las operaciones aritméticas y relacionales pueden vectorizarse. Por ejemplo,
podemos multiplicar por 3 al vector_2 :
vector_5 <- vector_2*3
vector_5
[1] 30.00 4.50 1.02 6000.00
2.1.4 Eliminar o cambiar elementos
Eliminar un valor del vector:
# Elimino el tercer valor del vector altura
altura[-3]
[1] 1.80 1.65 1.89 1.70
Elimino más de un valor:
# Elimino el tercer y quinto valor del vector altura
altura[-c(3, 5)]
[1] 1.80 1.65 1.89
Cambio el valor de un elemento
# Cambio el valor del tercer elemento por 1.86
altura[3] <- 1.86
altura
[1] 1.80 1.65 1.86 1.89 1.70
Hay que distinguir que en los dos primeros casos para que los vectores se guarden con la
modificación debería asignarlos en un objeto con el mismo nombre. Sin embargo, en el
tercer caso sí estoy modificando el vector.
Vimos que los objetos pueden combinarse para crear otros. Dentro de estos objetos que
llamaremos compuestos veremos los siguientes tipos: Matrices, Dataframes y Listas.
2.2 Matrices
Las matrices pueden describirse como vectores de dos dimensiones: filas y columnas. Al
igual que los vectores, solamente pueden contener datos de un sólo tipo. Estos objetos
se pueden crear con la función matrix() cuyos argumentos son:
matrix(data =, nrow =, ncol =, byrow =)
Siendo:
data : datos que se incluyen en la matriz.
nrow : número de filas.
ncol : número de columnas.
byrow : indica si los datos se llenan por filas o por columnas (byrow = TRUE o byrow =
FALSE ). Si no se introduce este argumento la matriz se completan por columnas.
Ejemplo, creamos una matriz de 3 filas y 2 columnas:
matriz_1 <- matrix( c(1, 2, 3, 4, 5, 6), nrow = 3, ncol = 2, byrow = FALSE)
matriz_1
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
2.2.1 Acceso a datos de una matriz
Como las matrices poseen dos dimensiones tenemos que determinar la fila y la columna
de interés que deseemos seleccionar mediante la siguiente sintaxis [fila, columna] .
Algunas posibilidades son:
1- El valor de una celda: se utiliza el siguiente esquema
nombre_de_la_matriz[número_de_fila, número_de_columna] . Ejemplo:
# Extraemos el primer elemento de la segunda columna
matriz_1[1,2]
[1] 4
2- Una fila: nombre_de_la_matriz[número_de_fila,]
# Extraemos las observaciones de la tercera fila
matriz_1[3,]
[1] 3 6
3- Una columna: nombre_de_la_matriz[, número_de_columna]
# Extraemos la primera columna
matriz_1[,1]
[1] 1 2 3
2.3 Dataframes
Este objeto es similar a las matrices, pero cada columna corresponde a una variable y las
filas a observaciones. La diferencia con una matriz es que cada variable (columna) puede
ser de diferente clase. Esta estructura de datos es la más utilizada para realizar análisis
de datos. Para crear un dataframe utilizamos la función [Link]() . Esta función
nos pedirá un número de vectores igual al número de columnas que deseemos. Todos
los vectores que proporcionemos deben tener el mismo largo. Un dataframe está
compuesto por vectores. Como ejemplo creemos un dataframe que contenga 3 variables
y 4 observaciones:
dataframe_1 <- [Link](
"variable_numerica" = c(4.9, 3.5, 2, 1.6),
"variable_caracter" = c("a", "b", "c", "d"),
"variable_logica" = c(FALSE, TRUE, FALSE, TRUE)
)
dataframe_1
variable_numerica variable_caracter variable_logica
1 4.9 a FALSE
2 3.5 b TRUE
3 2.0 c FALSE
4 1.6 d TRUE
Podemos ver que los argumentos de la función son tres vectores a los cuáles les
asignamos un nombre que se convertirá en el de la columna. Como ya dijimos, el
dataframe es la clase de objeto más importante para trabajar con datos. Acabamos de
ver cómo construirlo manualmente pero, generalmente, las bases de datos se
encuentran en archivos aparte y se importan a R. En el Módulo 3 veremos cómo crear
dataframes leyendo datos de archivos o de paquetes.
2.3.1 Acceso a datos de un dataframe
Dado que los dataframes poseen dos dimensiones, tenemos que especificar la fila y la
columna de interés que deseemos seleccionar mediante la siguiente sintaxis
[fila, columna] . Veamos las opciones posibles de selección:
1- Un dato o valor:
- Utilizando el esquema
nombre_del_dataframe[número_de_fila, número_de_columna] :
# Extraemos el tercer dato de la variable que se encuentra en la segunda columna
dataframe_1[3,2]
[1] "c"
- Utilizando el operador $ y el nombre de la variable:
# Extraemos el tercer dato de la variable que se encuentra en la segunda columna
dataframe_1$variable_caracter[3]
[1] "c"
- Utilizando el nombre de la variable y corchetes simples (también funciona con
corchetes dobles):
dataframe_1[3,"variable_caracter"]
[1] "c"
2- Una fila:
- Utilizando la notación nombre_del_dataframe[número_de_fila,]
# Extraemos las observaciones de la tercera fila
dataframe_1[3,]
variable_numerica variable_caracter variable_logica
3 2 c FALSE
3- Una columna:
- Con el esquema nombre_del_dataframe[, número_de_columna] :
# Extraemos la segunda columna
dataframe_1[,2]
[1] "a" "b" "c" "d"
- Utilizando el operador $ para obtener la columna por su nombre:
# Extraemos la segunda columna con el operador $
dataframe_1$variable_caracter
[1] "a" "b" "c" "d"
- Utilizando corchetes:
dataframe_1["variable_logica"]
variable_logica
1 FALSE
2 TRUE
3 FALSE
4 TRUE
dataframe_1[["variable_logica"]]
[1] FALSE TRUE FALSE TRUE
Notemos que no es lo mismo utilizar simples y dobles. Al consultar la clase del objeto
extraído, en el primer caso obtengo un dataframe y en el segundo un vector de tipo
lógico.
class(dataframe_1["variable_logica"])
[1] "[Link]"
class(dataframe_1[["variable_logica"]])
[1] "logical"
4- Valores únicos de una columna:
Si deseo quedarme con valores únicos de una variable puedo utilizar la función unique :
# Obtengo los valores únicos (sin repetición) de la tercera columna de dataframe_
1:
unique(dataframe_1$variable_logica)
[1] FALSE TRUE
2.4 Listas
Las listas son objetos que permiten almacenar múltiples estructuras de datos en un solo
lugar, es decir, cada uno de los elementos contenidos pueden ser de diferente tipo. Las
listas pueden tener vectores, matrices, dataframes, otras listas, etc. Para crear una lista
se utiliza la función list() , dónde indicaremos los elementos a incluir. Al igual que con
un dataframe podemos poner nombre a cada elemento.
Utilicemos algunos de los objetos que fuimos generando para crear una lista:
lista_1 <- list(vector_1, vector_2, vector_3, matriz_1, dataframe_1)
lista_1
[[1]]
[1] "a" "abcv" "abc123" "Hola" "Hola_2"
[[2]]
[1] 10.00 1.50 0.34 2000.00
[[3]]
[1] FALSE TRUE FALSE TRUE
[[4]]
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
[[5]]
variable_numerica variable_caracter variable_logica
1 4.9 a FALSE
2 3.5 b TRUE
3 2.0 c FALSE
4 1.6 d TRUE
2.4.1 Acceso a los objetos de una lista
Se puede acceder a cada objeto empleando los corchetes cuadrados dobles [[]] para
determinar el número de objeto al que se quiere acceder. Por ejemplo, en la lista_1
tenemos cinco objetos. Para acceder al quinto:
lista_1[[5]]
variable_numerica variable_caracter variable_logica
1 4.9 a FALSE
2 3.5 b TRUE
3 2.0 c FALSE
4 1.6 d TRUE
En este caso obtenemos el dataframe con formato [Link] .
class(lista_1[[5]])
[1] "[Link]"
Puedo extraer el mismo objeto pero con corchetes simples [] pero obtendremos una
lista:
lista_1[5]
[[1]]
variable_numerica variable_caracter variable_logica
1 4.9 a FALSE
2 3.5 b TRUE
3 2.0 c FALSE
4 1.6 d TRUE
class(lista_1[5])
[1] "list"
Si a los elementos de la lista les establezco un nombre también puedo acceder a ellos
con el operador $ :
lista_1 <- list("vector_1"=vector_1, "vector_2"=vector_2, "vector_3"=vector_3, "m
atriz_1"=matriz_1, "dataframe_1"=dataframe_1)
lista_1
$vector_1
[1] "a" "abcv" "abc123" "Hola" "Hola_2"
$vector_2
[1] 10.00 1.50 0.34 2000.00
$vector_3
[1] FALSE TRUE FALSE TRUE
$matriz_1
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
$dataframe_1
variable_numerica variable_caracter variable_logica
1 4.9 a FALSE
2 3.5 b TRUE
3 2.0 c FALSE
4 1.6 d TRUE
# Acceso al primer objeto de la lista
lista_1$vector_1
[1] "a" "abcv" "abc123" "Hola" "Hola_2"
2.4.2 Acceso al contenido de un único componente de una lista
También se puede acceder a un elemento específico de un objeto de la lista utilizando la
notación que vimos en cada tipo de objeto. Por ejemplo, para obtener la primera
columna del dataframe de la lista podemos proceder de la siguiente manera:
# Obtención de la primera columna del quinto objeto
lista_1[[5]][,1]
[1] 4.9 3.5 2.0 1.6
O de manera equivalente:
lista_1[[5]]$variable_numerica
[1] 4.9 3.5 2.0 1.6
También:
lista_1[[5]][1]
variable_numerica
1 4.9
2 3.5
3 2.0
4 1.6
La diferencia reside en que en los dos primeros casos obtengo un vector numérico en el
último tengo un dataframe.
class(lista_1[[5]][,1])
[1] "numeric"
class(lista_1[[5]]$variable_numerica)
[1] "numeric"
class(lista_1[[5]][1])
[1] "[Link]"
Para obtener una observación específica:
# Obtención de la primera observación de la primera columna del quinto objeto
lista_1[[5]]$variable_numerica[1]
[1] 4.9
O también:
# Obtención de la primera observación de la primera columna del quinto objeto
lista_1[[5]][1,1]
[1] 4.9
2.5 Resumen
Acabamos de ver cuatro tipos o estructuras de objetos (vector, matriz, dataframe y lista):
Unidimensionales con elementos de una única clase: vector.
Bidimensionales con elementos de una única clase: matriz.
Bidimensionales con elementos de varias clases: dataframe.
Unidimensionales con elementos de varias clases: lista.
Programar en R es aplicar funciones a objetos. La validez de las funciones que utilicemos
va a depender tanto de la estructura de los objetos como el tipo de elementos que estos
almacenen. Por lo tanto, siempre es importante cuando se opera sobre un objeto tener
claro de qué estructura es el objeto y de qué clase son los elementos que contiene. Si
trabajo con vectores utilizo la función class() para determinar la clase de sus
elementos. Si se trata de dataframes debería explorar la clase de las variables
(columnas).
3 Operadores
3.1 Operadores aritméticos
Con los objetos numéricos creados (como el anterior x ) se pueden realizar operaciones
aritméticas. Por ejemplo, si creo el objeto y asignándole el valor 2 puedo realizar lo
siguiente:
# Creo el objeto y igual a 2
y <- 2
# Suma del objeto x que ya habíamos creado más arriba y el objeto y
x + y
[1] 12
# Resta
x - y
[1] 8
# Multiplicación
x*y
[1] 20
# División
x/y
[1] 5
# Potenciación
x^y
[1] 100
Los operadores aritméticos utilizados son los presentes en la siguiente tabla:
Tabla 3.1: Operadores aritméticos
Operador Descripción
+ Suma
- Resta
* Multiplicación
/ División
^ Potenciación
Hemos ejecutados estos comandos sin crear objetos. Los resultados se imprimen en la
consola. Pero, también se puede asignar a un objeto el resultado de una operación, por
ejemplo:
# Creamos el objeto z
z <- x*2 - y^3
z
[1] 12
3.2 Operadores de comparación
Los operadores de comparación o relacionales generan un resultado a partir de que se
cumpla o no una condición de comparar. Siempre devuelven como resultado TRUE o
FALSE (verdadero o falso).
Tabla 3.2: Operadores de comparación
Operador Descripción
> Mayor
>= Mayor o igual
< Menor
<= Menor o igual
== Igual
!= Distinto
Ejemplos:
# Mayor
5>1
[1] TRUE
# Mayor o igual
5>=1
[1] TRUE
# Menor
5<1
[1] FALSE
# Menor o igual
5<=1
[1] FALSE
# Igual
5==1
[1] FALSE
# Distinto
5!=1
[1] TRUE
Las comparaciones se pueden realizar también entre objetos. En el caso de las cadenas
de texto, estos operadores tienen un comportamiento especial. Por ejemplo, “campo” >
“banco” nos devuelve TRUE . Esto es así porque R realiza una comparación por orden
alfabético. En el ejemplo, la palabra “campo” tiene una posición posterior a “banco”, por
lo tanto, es verdadero que sea “mayor”.
3.3 Operadores lógicos
Los operadores lógicos son utilizados para operaciones de álgebra booleana, es decir,
para describir relaciones lógicas expresadas como verdadero (TRUE) o falso (FALSO).
Tabla 3.3: Operadores lógicos
Operador Descripción
! Negación
| O
& Y
Los operadores | y & siguen estas reglas:
| devuelve TRUE si alguno de los datos es TRUE
& solo devuelve TRUE si ambos datos es TRUE
| solo devuelve FALSE si ambos datos son FALSE
& devuelve FALSE si alguno de los datos es FALSE
Estos operadores pueden ser utilizados con datos de tipo numérico y lógico. Al igual que
con los operadores de comparación siempre devuelven TRUE o FALSE .
Siguiendo con los objetos x e y ya creados podemos ver algunos ejemplos
combinando operadores de comparación y lógicos (recordar que a x le asignamos el
valor 10 y a y el valor 2):
!(y==x)
[1] TRUE
!(y==x) & (x==z)
[1] FALSE
!(x==y) | (x==z)
[1] TRUE
4 Valores especiales y valores faltantes
Hay un número especial Inf que representa el infinito. Si hacemos un número dividido
cero nos dará Inf .
5/0
[1] Inf
Por otro lado, el valor NaN representa un valor indefinido. Por ejemplo si hago cero
dividido cero.
0/0
[1] NaN
En el caso que nos encontremos con un valor NA este representa que no está
disponible. Este puede existir en cualquier tipo de vectores numéricos o de caracteres.
Generalmente se interpreta como valores faltantes. Ejemplo:
vector_e <- c(5, 7, 23, 76, 15, 100, NA)
Un valor NAN o NA en un vector dificulta la realización de cálculos. Por lo tanto,
deberíamos eliminarlo o reemplazarlo antes de realizar cualquier operación. Más
adelante veremos su tratamiento.
Como vimos, los valores faltantes se denotan como NA o como NaN para operaciones
matemáticas indefinidas. Tenemos las siguientes funciones para comprobar su
existencia:
[Link]() se utiliza para probar si los objetos son NA . Ejemplo:
# Creo un vector que contenga algún NA
a <- c(4, NA, 10, 3, 11)
# Obtengo un vector lógico que me indica que elementos del vector "a" son NA
[Link](a)
[1] FALSE TRUE FALSE FALSE FALSE
Como se observa en la salida el segundo elemento del vector es TRUE porque es NA y el
resto de los elementos son FALSE porque no los son. De la misma forma utilizamos la
función [Link]() ac continuación:
[Link]() se utiliza para probar si los objetos son NaN . Ejemplo:
# Creo un vector que contenga algún NaN
b <- c(1, NaN, 23, NaN, 0)
# Obtengo un vector lógico que me indica que elementos del vector "b" son NaN
[Link](b)
[1] FALSE TRUE FALSE TRUE FALSE
Los valores NA también tienen una clase, por lo que hay números NA , números enteros
NA , caracteres NA , etc.
Un valor NaN también es un NA , pero lo inverso no es cierto. Veámoslo:
# Creo un vector que contenga algún NaN y NA
c <- c(100, 79, NaN, NA, NaN, 32, 14)
# Compruebo que elementos de el objeto "c" son NA
[Link](c)
[1] FALSE FALSE TRUE TRUE TRUE FALSE FALSE
# Compruebo que elementos de el objeto "c" son NaN
[Link](c)
[1] FALSE FALSE TRUE FALSE TRUE FALSE FALSE
Los elementos 3, 4 y 5 de c son NA pero solo los elementos 3 y 5 son Nan .
Más adelante analizaremos los recaudos que hay que tener al realizar operaciones con
vectores o variables que contengan valores faltantes.
5 Funciones
Como mencionamos, las funciones también son un tipo de objeto. Las funciones son
expresiones que dan una orden a R de ejecutar una o muchas tareas empleando objetos
y/o parámetros. La función a utilizar depende exclusivamente de cómo sea el objeto al
que se la pienso aplicar, por ejemplo, no puedo hacer una suma de dos vectores que
sean del tipo carácter.
En general, las funciones en R tienen la forma: función(argumentos) . Ya hemos
estado utilizando funciones como por ejemplo help , class , matrix , [Link] o
list . Estas, al instalar R, ya están disponibles. R posee las suficientes funciones para
que realicemos todas las tareas básicas de análisis de datos. Sin embargo, a veces
necesitamos realizar tareas muy específicas para las cuales no existe una función
determinada o si existe pero, hay que combinar una serie de funciones complicando
nuestro trabajo. Es por ello que podemos crear funciones definidas por nosotros o
instalar paquetes que dispongan de las funciones que necesitamos. Toda función está
compuesta por un nombre, argumentos y un cuerpo.
En las funciones que vienen con los paquetes los argumentos se pueden consultar en la
ayuda, algunos de ellos vienen definidos por default y otros hay que especificarlos.
Las funciones definidas por el usuario son creadas usando la siguiente estructura:
nombre <- function(argumentos) {
operaciones
}
Partes de la función:
El nombre permite ejecutar la función.
Los argumentos son las variables que necesita la función para realizar sus operaciones.
Aparecen entre paréntesis, separados por comas.
El cuerpo de la función contiene, entre llaves, todas las operaciones que se ejecutarán
cuando la función es ejecutada.
Veamos un ejemplo sencillo: supongamos que queremos crear una función que calcule
el área de un triángulo, es decir (base x altura)/2 . Vamos a convertir esta fórmula a
operaciones de R y asignarlas a una función que llamaremos area_triang .
# Función. Área de un triángulo
area_triang <- function(base, altura) {
(base * altura)/2
}
Siendo las partes de la función:
Nombre: area_triang.
Argumentos: base, altura. Representan el largo de la base y la altura del triángulo.
Cuerpo: La operación (base * altura)/2.
Para probar que funciona ejecutamos la función con distintos argumentos para la base y
la altura. Los argumentos deben seguir el orden especificado en la creación de la función
(aunque en este ejemplo en particular no va a cambiar el resultado si no lo respeto).
area_triang(base=3, altura=2)
[1] 3
area_triang(base=4, altura=5)
[1] 10
Otro ejemplo
Supongamos que queremos crear una función que me permita saber para cada columna
de un dataframe cualquiera: el nombre, la posición (si es la primera columna, la
segunda, etc.) y la clase. Vamos a crear un dataframe que contenga esta información:
# Creamos la función
funcion_col <- function(df){
[Link](
col_nombre = colnames(df),
col_ubicacion = 1:ncol(df),
col_clase = sapply(df, class)
)
}
El código dentro de la función tiene muchas cosas no vistas pero, que no es importante
entender de momento (pueden investigarlo utilizando la ayuda si les interesa).
Simplemente queríamos mostrar otro ejemplo de cómo crear una función y que fuera de
mayor utilidad que el cálculo del área de un triángulo. Utilicemosla en un dataframe que
ya tengamos:
# Utilizamos la función con el dataframe llamado dataframe_1
funcion_col(dataframe_1)
col_nombre col_ubicacion col_clase
variable_numerica variable_numerica 1 numeric
variable_caracter variable_caracter 2 character
variable_logica variable_logica 3 logical
6 Ejercitación
Estos ejercicios tienen como finalidad repasar lo visto en este módulo. No debe
entregarse la resolución de los mismos. Si tiene alguna duda de cómo resolverlos puede
preguntar en el foro correspondiente o en el encuentro sincrónico.
1- Cree un objeto llamado objeto_1 y asígnele el valor 45.
2- Súmele 14 al objeto_1 y guárdelo con este nuevo valor.
3- Utilizando la función c() cree un vector que contenga las siguientes palabras:
Manzanas, Naranjas, Peras, Ciruelas y Duraznos. ¿Qué tipo de vector es?
4- Utilice : para crear un vector numérico que contenga los números del 1 al 10 y
denomínelo v_1a10 .
5- Busque la ayuda para la función rep , léala y cree un vector llamado vector_2 que
contenga la letra a repetida 9 veces.
6- Cree cuatro vectores, uno de cada clase vista en el curso. Determine de qué clase de
objeto obtengo si combino los siguientes vectores:
a- numérico y carácter.
b- numérico y lógico.
c- lógico y carácter.
d- factor y lógico.
e- factor y numérico.
f- factor y carácter.
7- Cree una matriz con nueve filas y tres columnas que contenga los números del 1 al 9
en cada columna. Asígnela a un objeto llamado matriz_1 .
8- Seleccione la columna 2 de la matriz anterior y guárdela en un objeto.
9- Cree un dataframe llamado df_1 que contenga en la primera columna el vector
creado en el punto anterior y en la segunda el vector llamado vector_2 . Cambie el
nombre de las variables al crear el dataframe estableciendo el nombre variable_1
para la primera columna y variable_2 para la segunda.
10- Cree una lista llamada lista_1 que contenga: el objeto objeto_1 , el vector
v_1a10 , a la matriz matriz_1 y al dataframe df_1 .
11- Extraiga de la lista_1 el elemento ubicado en la fila 3 columna 2 de la matriz
matriz_1 .
12- Cree una función que reciba dos números y que devuelva la suma de estos.
7 Créditos
Para realizar este archivo se utilizó el programa R (R Core Team 2016) con el paquete
Rmarkdown (Xie, Allaire, and Grolemund 2018).
Bibliografía
Allaire, JJ, Yihui Xie, Christophe Dervieux, Jonathan McPherson, Javier Luraschi, Kevin Ushey, Aron
Atkins, et al. 2023. Rmarkdown: Dynamic Documents for r. [Link]
([Link]
Long, JD, and Paul Teetor. 2019. R Cookbook. [Link]
([Link]
Mateos Farfán E., Santana Sepúlveda J. S. y. 2014. El Arte de Programar En r Un Lenguaje Para La
Estadística. [Link]
([Link]
R Core Team. 2016. R:a Language and Environment for Statistical Computing. Vienna, Austria: R
Foundation for Statistical Computing. [Link] ([Link]
Wickham, & Grolemund, H. 2017. R Para Ciencia de Datos. [Link]
([Link]
Xie, Yihui, J. J. Allaire, and Garrett Grolemund. 2018. R Markdown: The Definitive Guide. Boca Raton,
Florida: Chapman; Hall/CRC. [Link]
([Link]