library(learnr)
knitr::opts_chunk$set(echo = FALSE)

Introducción

knitr::include_graphics("images/funciones_predefinidas.jpg")

El presente tutorial pretende ser un vehículo de aprendizaje interactivo para los novatos en el lenguaje R.

Ha sido desarrollado a través del paquete learnr que permite utilizar documentos RMarkdown para generar tutoriales interactivos.

Como se explica en la página de learnr, los tutoriales consisten en contenido (texto, figuras, ilustraciones, ecuaciones, vídeos, etc.) junto con componentes interactivos, como preguntas con múltiples opciones y fragmentos de código de R que los usuarios pueden editar y ejecutar directamente, para verificar y reforzar la comprensión.

Estos tutoriales conservan automáticamente el avance que un usuario realizó, por lo que si un estudiante trabaja en algunos ejercicios o preguntas y vuelve al tutorial más tarde, puede retomarlo exactamente donde lo dejó.

Este tutorial ha sido publicado como el paquete fundamentosr.

Objetivo de aprendizaje

El objetivo de aprendizaje del presente tutorial es el siguiente:

Funciones

Una función es una secuencia de operaciones (sentencias de código) que son gestionadas como un todo, reciben un nombre y permiten llevar a cabo un procedimiento con posibilidad de ser parametrizado para su uso cuantas veces sea necesario y en el momento requerido.

Un ejemplo de función podría ser aquella que recibiese una cadena de caracteres y la convirtiese a mayúscula. Esta función ya está definida y lista para poder ser usada en R y se llama toupper.

knitr::include_graphics("images/mayusculas.jpg")

Una función presenta las siguientes características:

A continuación mostraremos varios ejemplos ilustrativos del uso de una función. Para ello utilizaremos la función toupper.

#Invocación de función con valor literal
toupper("Hola")
#Invocación de función con variable y asignación de salida
cadena_a_convertir<-"adios"
cadena_mayusculas<-toupper(cadena_a_convertir)
cadena_mayusculas
#Función en expresión
toupper("HaStA lUeGo")=="HASTA LUEGO"

En el código anterior puedes comprobar cómo se muestra la invocación de una función con un valor literal, con una variable y una posterior asignación y, finalmente, dentro de una expresión de comparación.

Funciones predefinidas en R

El lenguaje de programación R nos proporciona un amplio conjunto de funciones y constantes predefinidas. Existe un conjunto de paquetes estándar (o base) que se consideran parte del código fuente de R y están automáticamente disponibles como parte de la instalación de R. Los paquetes base contienen las funciones básicas que permiten a R funcionar como lenguaje de programación junto a diferentes conjuntos de funciones útiles ya implementadas.

Las diferentes funciones predefinidas en R están relacionadas, entre otros, con los siguientes ámbitos:

knitr::include_graphics("images/cadenas_caracteres.jpg")
knitr::include_graphics("images/matematicas.jpg")
knitr::include_graphics("images/entorno.jpg")
knitr::include_graphics("images/tipos_datos.jpg")
knitr::include_graphics("images/paquetes.jpg")
knitr::include_graphics("images/ayuda.jpg")
knitr::include_graphics("images/estadistica.jpg")

Manipulación de cadenas

En esta sección se presentarán las diferentes funciones para llevar a cabo la manipulación básica de cadenas de caracteres. Por manipulación básica entendemos la transformación y procesamiento de cadenas que no requiere del uso de expresiones regulares.

Una expresión regular es una secuencia de caracteres que forma un patrón de búsqueda, principalmente utilizada para la búsqueda de patrones de cadenas de caracteres u operaciones de sustituciones. Las expresiones regulares en R serán explicadas y utilizadas en un tutorial específico para ello.

Tras las funciones de manipulación básica se presentarán algunas funciones básicas para visualizar las cadenas de caracteres y proporcionarles el formato deseado.

knitr::include_graphics("images/cadenas_caracteres.jpg")

Manipulación básica de cadenas

R proporciona un conjunto de funciones muy prácticas para la manipulación de cadenas de caracteres que se presentan a continuación:

Función | Descripción | :--|:--| nchar() | número de caracteres tolower()| conversión a minúsculas toupper()| conversión a mayúsculas casefold()| conversión a mayúsculas o minúsculas chartr() | traducción de caracteres abbreviate()| abreviación substr() | extracción o reemplazamiento de caracteres

A continuación mostraremos la utilidad y ejemplos del uso de las diferentes funciones.

nchar():

Una de las principales funciones para la manipulación de cadenas es nchar() que cuenta el número de caracteres en una cadena. En otras palabras, nchar() proporciona la longitud de una cadena. Puedes probarla en el siguiente ejemplo.

#¿Cuántos caracteres tiene la cadena "Hola amigo"?
longitud_hola<-nchar("Hola amigo")
longitud_hola
#¿Qué cadena tiene mayor longitud?
cadena_adios<-"Adios amiga"
nchar("Hola amigo")>nchar(cadena_adios)

En el primer ejemplo podemos comprobar como los blancos forman parte de la longitud de la cadena. En el segundo ejemplo se usa un operador relacional para comparar la longitud de dos cadenas.

tolower(), toupper(), casefold():

R proporciona tres funciones diferentes para conversión entre mayúsculas y minúsculas (casefolding):

Veamos a continuación un ejemplo de uso de las tres funciones:

#Conversión a minúscula
hola_minuscula<-tolower("HoLa aMiGo")
hola_minuscula
#Conversión a MAYÚSCULA
adios_mayuscula<-toupper("aDios aMiga")
adios_mayuscula
#Conversión a minúscula / MAYÚSCULA
hola_minuscula<-casefold("HoLa aMiGo")
hola_minuscula
adios_mayuscula<-casefold("aDios aMiga",upper=TRUE)
adios_mayuscula

La función tolower() deja las minúsculas intactas, al igual que la función toupper() deja las mayúsculas intactas. La función casefold() puede representar a ambas. Mediante el valor del argumento upper podemos definir la funcionalidad representada por casefold(). Por defecto este parámetro tiene el valor FALSE si no recibe valor (mismo efecto que tolower()). Para asignarle un valor en la llamada a la función se usa el operador =, equivalente al de asignación <- (upper=TRUE tiene el mismo efecto que toupper()).

chartr():

La función chartr() permite la traducción (sustitución) de caracteres. Recibe tres argumentos: una cadena con los caracteres a sustituir sust, una cadena con los caracteres destino dest y, finalmente, la cadena a transformar transf.

chartr( sust, dest, transf)

La función chartr() reemplaza los caracteres de la cadena sust que aparecen en transf por los de la cadena dest. Veamos varios ejemplos de su uso:

#Sustitución de un caracter
transf<-"Los gatos vienen muy lentos"
sust<-"o"
dest<-"a"
chartr(sust,dest,transf)
#Sustitución de varios caracteres
transf<-"|XD|XD|XD|XD|"
sust<-"XD"
dest<-";)"
chartr(sust,dest,transf)

En el primer caso, queremos sustituir la letra "o" con "a" (upper case) en la frase incluida en transf. En el segundo caso, queremos sustituir el caracter "X" por el caracter ";" y la letra "D" por el caracter ")". Es importante que las cadenas sust y dest tengan el mismo número de caracteres (la misma longitud) para que no se produzcan comportamientos inesperados.

abbreviate():

La función abbreviate() permite obtener, para una cadena cadena_completa, una abreviación (cadena corta) de longitud definida por un parámetro que recibirá como argumento minlength. Para llamar a la función abbreviate() debemos proporcionar un valor al parámetro minlength mediante la asignación usando el símbolo =. Veamos un ejemplo.

#Abreviación de cadena
cadena_completa<-"Categoria"
abbreviate(cadena_completa,minlength=3)
cadena_completa<-"Categoria"
abbreviate(cadena_completa,minlength=4)
)

Un uso común de esta función aparece cuando se desean mostrar los nombres simplificados para un conjunto de variables en un gráfico o en una tabla.

substr():

Una de las operaciones más comunes cuando se está trabajando con cadenas es la de la extracción de una parte de las mismas o la sustitución de una parte de las mismas por otra cadena diferente. Si la sustitución se basa en en la posición ocupada por los caracteres dentro de la cadena podemos usar la función substr().

La función substr() extrae o reemplaza subcadenas dentro de una cadena cadena_inicial, siendo inicio el primer elemento que será reemplazado y fin el último elemento a reemplazar: substr(cadena_inicial,inicio,fin). Veamos algunos ejemplos:

#Extracción de subcadena
cadena_completa<-"Código: abxccs"
substr(cadena_completa,9,14)
cadena_completa
#Reemplazar subcadena
cadena_completa<-"Código: abxccs"
substr(cadena_completa,9,14)<-"******"
cadena_completa

En el primer caso, extraemos la parte de la cadena cadena_completa correspondiente al código. El código comienza en el 9º caracter (recuerda contar el espacio en blanco como caracter). La variable cadena_completa no se modifica.

En el segundo caso, reemplazamos la parte correspondiente al código. Para ello se hace uso de una asignación <- a la derecha de la cual aparece la cadena que reemplazará a la sustituida (todo asteriscos). En este caso, la variable cadena_completa sí se habrá modificado con el correspondiente reemplazamiento. La cadena de reemplazo tiene la misma longitud (número de caracteres) que la subcadena sustituida.

Formateo y visualización de cadenas

Una tarea común cuando se trabaja con cadenas de caracteres es la de visualizarlas en pantalla o guardarlas en un fichero. Existen diferentes funciones y opciones para imprimir cadenas en una amplia variedad de formatos. A continuación veremos algunas de ellas:

Función | Descripción | :--|:--| print() | visualización genérica noquote()| visualización sin comillas cat()| concatenación paste()| concatenación (vector de cadenas) format()| formatos especiales sprintf()| visualización según el estilo del lenguaje

A continuación mostraremos la utilidad para la visualización y los resultados del uso de las diferentes funciones para diferentes ejemplos.

print(),noquote()

La función print() es la más conocida y utilizada. Permite imprimir en pantalla la cadena recibida como argumento. Es utilizada también como función genérica de visualización para el resto de tipos de datos.

print("Vamos a sustituir la palabra usuario por #######")
cadena_completa<-"Bienvenido usuario"
print(cadena_completa)
substr(cadena_completa,12,19)<-"#######"
print(cadena_completa)

La función noquote() actúa como print() para cadenas de caracteres con la diferencia de que visualiza las cadenas de caracteres sin las comillas. Mostremos el ejemplo anterior pero sustituyendo la función print() por noquote(). Puedes comprobar el resultado:

noquote("Vamos a sustituir la palabra usuario por #######")
cadena_completa<-"Bienvenido usuario"
noquote(cadena_completa)
substr(cadena_completa,12,19)<-"#######"
noquote(cadena_completa)

cat(),paste()

La función paste() opera sobre vectores de cadenas de caracteres y la veremos en un tutorial posterior sobre Vectores. La función cat() es muy útil y potente para concatenar objetos como cadenas de caracteres y poder visualizar el resultado en pantalla o escribirlo a fichero. Uno de sus parámetros de entrada posibles es sep cuyo valor por defecto es " ". Veamos algunos ejemplos de su uso con cadenas de caracteres:

cat("Hola","mundo")
cat("Hola","mundo",sep="-")
cat("Hola","mundo","feliz")
cat("Hola","mundo","feliz",sep="|$|")
cat("Hola","mundo","feliz","dia")
cat("Hola","mundo","feliz","dia",sep="")

En estos ejemplos podemos comprobar como la función cat() puede recibir al principio cualquier número de cadenas de caracteres separadas por ,. La modificación del separador por defecto se realiza asignando una cadena al argumento sep. Si esta cadena es vacía ("") la concatenación se realiza sin separación alguna.

Vamos a probar la función cat() con otros tipos de datos y veremos como se convierten automáticamente a cadenas de caracteres.

#Del 1 al 10 (números como cadena)
cat(1,2,3,4,5,6,7,8,9,10,sep="-")
#Lógicos y cadenas
cat(TRUE,"o",FALSE,", esa es la cuestión.")
#Presencia de tipos diferentes en una misma cadena
valor1<-0.5
valor2<-3.5
cat("¿",valor1,"es menor que",valor2,"?","Eso es:",valor1<valor2)

En el primer caso, cat() permite concatenar los enteros (tipo de datos integer) del 1 al 10 y utiliza como separador el guión (-). Todos los enteros son convertidos a cadenas de caracteres.

En el segundo caso, concatenamos cadenas de caracteres con los valores lógicos TRUE y FALSE (tipo de datos logical). Ambos valores son convertidos automáticamente a cadenas de caracteres. Usamos el separador por defecto (espacio en blanco).

Para el tercer y último caso, usamos dos variables en las que recogemos dos números flotantes (tipo de datos numeric). Los números son comparados (expresión relacional) y en la cadena de caracteres final concatenamos flotantes, cadenas y valor lógico para mostrar el resultado de la comparación. Todos los tipos de datos se convierten automáticamente a cadenas de caracteres.

format()

La función format() permite establecer un formato para la visualización de un objeto en R. Es muy útil para la visualización de números y cantidades en diferentes formatos, transformándolos previamente a cadenas de caracteres.

Puede recibir los siguientes argumentos relacionados directamente con cadenas de caracteres:

Veamos algunos ejemplos de uso:

format("Hola mundo",width=20)
format("Hola mundo",width=20,justify="right")
format("Hola mundo",width=20,justify="centre")

En el primer caso, se amplia la cadena de caracteres que contiene la cadena original a longitud 20 y se toma la justificación (alineación) por defecto. En el segundo y en el tercer caso se define una justificación a través del parámetro justify.

Para el formato de números la función format() dispone además de los siguientes parámetros como argumentos:

Veamos ejemplos del uso de format() con números:

format(17.33,nsmall=7)
format(17.33,digits=3)
format(10/3,nsmall=7)
format(10/3,digits=3)

Podemos comprobar la diferencia entre una expresión 10/3 y un literal 17.33. Al usar nsmall se rellena mediante ceros en el literal, mientras que se toman más decimales en el caso de la expresión. Por otra parte, el uso de digits supone escoger en primer lugar las cifras de la parte entera y completar con las de la parte decimal.

sprintf()

Se trata de una función que proporciona un formateo de cadenas similar al del lenguaje C.

Presenta como primer argumento una cadena de caracteres correspondiente al texto que será formateado. Esta cadena de caracteres incluye el símbolo % cada vez que se desea incluir un nuevo objeto formateado, proporcionándose dicho objeto como un nuevo argumento. A continuación del % se proporciona una de las opciones de formateo que puede estar entre las siguientes:

Opción | Descripción | :--|:--| s| cadena d| entero 0xd | entero relleno con ceros hasta x digitos. f | flotante .xf | flotante con x decimales

Veamos algunos ejemplos del uso de sprintf con un solo argumento adicional a la cadena.

#Incluimos un entero en la cadena
sprintf("Luis tiene %d coches.",5)
#Relleno con ceros tras la inclusión de entero
sprintf("Luis ha reservado la habitación %03d.",5)
#Incluimos otra cadena
nombre<-"Raquel"
sprintf("Su nombre es %s.",nombre)
#Incluimos un flotante en la cadena
sprintf("El valor de pi es: %f",pi)
#Incluimos un flotante en la cadena (precisión 8 decimales)
sprintf("El valor de pi es: %.8f",pi)
#Incluimos un valor lógico en la cadena
sprintf("Veamos si 5 > 3 => %d",5>3)

En todos los casos se puede comprobar como la expresión que aparece a continuación de la cadena se convierte en cadena de caracteres y se incluye en la posición correspondiente a la opción de formateo. Se ha de tener en cuenta la presencia de la constante predefinida pi en los casos donde aparecen flotantes. Además, se debe considerar la interpretación de los valores lógicos, en esta función, como enteros (último de los ejemplos).

Finalmente, mostraremos algunos ejemplos del uso de varios tipos de datos diferentes en la función sprintf.

#Incluimos un entero y una cadena dentro de la cadena
sprintf("%s tiene %d coches.","Luis",5)
nombre<-"Luis"
coches<-5
sprintf("%s tiene %d coches.",nombre,coches)
#Incluimos un entero y un flotante en la cadena
sprintf("El valor de %d grados en radianes es: %f",180,pi)
grados<-360
radianes<-2*pi
sprintf("El valor de %d grados en radianes es: %.8f",grados,radianes)

La función sprintf admite por orden todos los tipos adicionales cuya opción de formateo aparezca en la cadena proporcionada como primer argumento.

Funciones matemáticas

knitr::include_graphics("images/matematicas.jpg")

Las funciones matemáticas predefinidas en R se pueden englobar en cinco categorías:

Así mismo, los valores especiales Inf y NaN juegan un papel importante dentro de las funciones matemáticas.

Valores especiales Inf y NaN

Los valores especiales en los cálculos aritméticos en R son Inf y NaN.

Inf tiene forma positiva y negativa y representa los valores infinitos.

NaN (del inglés, "not-a-number") significa que nuestro cálculo o no tiene sentido matemático o que podría no haberse realizado correctamente.

Si un cálculo tiene como resultado un número que es demasiado grande, R devolverá Inf para un numero positivo y -Inf para un número negativo (esto es un valor infinito positivo y infinito negativo, respectivamente). También es cierto cuando hacemos la división entre cero.

numero_demasiado_grande<-10^2048
numero_demasiado_grande
numero_demasiado_peque<--10^2048
numero_demasiado_peque
division_por_cero<-100/0
division_por_cero

En el caso de que un cálculo produzca un resultado que no tiene sentido, R devolverá NaN:

calculo_sin_sentido<-Inf-Inf
calculo_sin_sentido
calculo_sin_sentido<-0/0
calculo_sin_sentido

La gestión de estos valores especiales es muy importante dentro de las funciones matemáticas.

De signo

Las funciones predefinidas de signo más representativas en R son las siguientes:

Veamos un ejemplo del uso de estas funciones.

#Cálculo del valor absoluto de un número
numero<--5
cat("El valor absoluto de",numero,"es",abs(numero),".")
#Signo de un número
numero<-7.99
cat("El signo del número",numero,"es",sign(numero),".")
#La raíz cuadrada de un número
numero<-81
cat("La raíz cuadrada de",numero,"es",sqrt(numero),".")

Trigonométricas e hiperbólicas:

R presenta las diferentes funciones trigonométricas e hiperbólicas como predefinidas. Las funciones seno, coseno y tangente (incluidas las hiperbólicas) reciben como argumento el ángulo en radianes. Estas funciones se detallan en la siguiente tabla.

Función | Descripción | Ejemplo :--|:--|:--| sin| Seno | sin(angulo) cos| Coseno | cos(angulo) tan| Tangente | tan(angulo) acos| Arcocoseno | acos(x) asin| Arcoseno | asin(x) atan| Arcotangente | atan(x) -------|------|-------------- sinh| Seno hiperbólico | sinh(angulo) cosh| Coseno hiperbólico | cosh(angulo) tanh| Tangente hiperbólica | tanh(angulo) acosh| Arcocoseno hiperbólico | acosh(x) asinh| Arcoseno hiperbólico | asinh(x) atanh| Arcotangente hiperbólica | atanh(x)

Veamos algunos ejemplos del uso de estas funciones a continuación.

#La función inversa al seno es el arcoseno
angulo<-pi/2
sprintf("El arcoseno del seno es el propio ángulo %f = %f.",angulo,asin(sin(angulo)))
sprintf("El arcoseno hiperbólico del seno hiperbólico es el propio ángulo %f = %f.",angulo,asinh(sinh(angulo)))
#La tangente es el cociente del seno y el coseno
angulo<-pi/6
cat("La tangente es",sin(angulo)/cos(angulo),"=",tan(angulo),".")
cat("La tangente hiperbólica es",sinh(angulo)/cosh(angulo),"=",tanh(angulo),".")

En los ejemplos anteriores podemos cómo en R se puede utilizar el anidamiento de funciones (llamar a una función dentro de otra) y cómo varias funciones forman parte de una expresión.

Redondeo

Existen distintas maneras, matemáticamente hablando, de redondear o truncar un valor a través de las funciones predefinidas de R:

#Redondeo hacia arriba
numero<-3.75
cat("Redondeo hacia arriba:",numero,"es redondeado a",round(numero,1),".")
#Redondeo hacia abajo
numero<-3.7345
cat("Redondeo hacia abajo:",numero,"es redondeado a",round(numero,1),".")
#Redondeo sin indicar decimales
numero<-3.73
cat("Redondeo sin decimales:",numero,"es redondeado a",round(numero),".")
#Devuelve el siguiente entero al número pasado como argumento
numero<-3.75
cat("Siguiente entero a",numero,"es",ceiling(numero),".")
numero<-3.05
cat("Siguiente entero a",numero,"es",ceiling(numero),".")
numero<-4
cat("Siguiente entero a",numero,"es",ceiling(numero),".")
numero<--1.25
cat("Siguiente entero a",numero,"es",ceiling(numero),".")
#Devuelve el entero anterior al número pasado como argumento
numero<-3.75
cat("Anterior entero a",numero,"es",floor(numero),".")
numero<-3.05
cat("Anterior entero a",numero,"es",floor(numero),".")
numero<-4
cat("Anterior entero a",numero,"es",floor(numero),".")
numero<--1.25
cat("Anterior entero a",numero,"es",floor(numero),".")
#Elimina los decimales del número pasado como argumento
numero<-3.75
cat("Si truncamos",numero,"obtenemos",trunc(numero),".")
numero<-0.05
cat("Si truncamos",numero,"obtenemos",trunc(numero),".")
numero<-pi
cat("Si truncamos",numero,"obtenemos",trunc(numero),".")
numero<--1.25378
cat("Si truncamos",numero,"obtenemos",trunc(numero),".")

Exponenciales y logarítmicas

R incluye las funciones exponenciales y logarítmicas como predefinidas. Todas ellas reciben como argumento el número o la expresión (x) a la cual se aplica la función. Estas funciones se detallan en la siguiente tabla.

Función | Descripción | Ejemplo :--|:--|:--| log| Logaritmo de base definida| log(x,base) log10| Logaritmo de base 10 | log10(x) log2| Logaritmo de base 2| log2(x) log1p| Logaritmo natural (x+1) | log1p(x) -------|------|-------------- exp| Exponencial | exp(x) expm1| Exponencial (x-1) | expm1(x)

Veamos algunos ejemplos del uso de estas funciones a continuación.

#La función inversa a la exponencial es el logaritmo de base e
x<-10
sprintf("La exponencial del logaritmo de la misma base es el mismo número %.2f = %.2f.",x,exp(log(x,base=exp(1))))
#La función inversa a la potencia en base 10 es el logaritmo de base 10
x<-pi
sprintf("La potencia de base 10 y exponente el logaritmo de base 10 es el mismo número %.2f = %.2f.",x,10^(log10(x)))
#La función inversa a la potencia en base 2 es el logaritmo de base 2
x<-0.25
sprintf("La potencia de base 2 y exponente el logaritmo de base 2 es el mismo número %.3f = %.3f.",x,2^(log2(x)))

Entorno de trabajo

El entorno de trabajo en R puede ser concebido como una colección de objetos (funciones, variables, etc.). Cualquier variable que se define en R (por ejemplo, desde RStudio) se encuentra en ese entorno. Así mismo, está definido por el conjunto de archivos sobre los que se pueden operar directamente, definido por el directorio de trabajo.

knitr::include_graphics("images/entorno.jpg")

Existen un conjunto de funciones básicas predefinidas que permiten consultar y operar sobre este entorno:

logica<-TRUE
numerica<-9.7
entera<-6
cadena<-"Hola"
ls()
logica<-TRUE
numerica<-9.7
entera<-6
cadena<-"Hola"
rm(logica)
logica
numerica
entera
cadena
logica<-TRUE
numerica<-9.7
entera<-6
cadena<-"Hola"
rm(list=ls())
logica
numerica
entera
cadena

Veamos a continuación un ejemplo del uso de las funciones getwd() y setwd() que permiten respectivamente recuperar y cambiar el directorio de trabajo.

#Guardamos el directorio de trabajo actual
directorio_trabajo<-getwd()
#Cambio a un nuevo directorio de trabajo
setwd("D:/R")
cat("El directorio de trabajo actual es:",getwd())
#Restauro el directorio de trabajo anterior
setwd(directorio_trabajo)
cat("El directorio de trabajo actual es:",getwd())
cat("Contenido del directorio de trabajo:")
list.files()
cat("Carpetas del directorio de trabajo")
list.dirs()

Puedes comprobar el efecto de todas estas funciones de gestión y consulta del entorno de trabajo utilizándolas en la consola de RStudio.

Tipos de datos

Las funciones predefinidas de R relacionadas con los tipos de datos están orientadas, por una parte, a determinar el tipo de datos de un objeto en R y, por otra parte, a convertir un objeto de un tipo de datos en otro tipo de datos (coerción explícita).

knitr::include_graphics("images/tipos_datos.jpg")

Existen además valores utilizados para los diferentes tipos de datos en situaciones especiales: datos no disponibles (NA) o ausencia de datos (NULL).

NA y NULL

En R, usamos NA para representar datos no disponibles, mientras que NULL representa un objeto nulo o vacío.

La diferencia entre los dos valores es que un valor NULL aparece en un tipo de datos sólo cuando R intenta recuperar un dato y no encuentra nada, mientras que el valor NA es usado para representar explícitamente datos perdidos, omitidos o que por alguna razón faltan. NA es la abreviación "not available".

Por ejemplo, si tratamos de recuperar los datos personales de una persona que no existe, obtendríamos un NULL, pues no hay ningún objeto que corresponda con ello. En cambio, si tratamos de recuperar uno de los datos personales recogidos para un grupo de personas, y la persona correspondiente no lo tiene disponible, obtendríamos el valor NA.

NA además puede aparecer como resultado de una operación realizada, pero que no tuvo éxito en su ejecución.

Consulta del tipo de datos

Las funciones predefinidas que permiten consultar el tipo de datos de un objeto en R son las siguientes:

También podemos verificar si un dato es de un tipo específico con la familia de funciones is.().Estas funciones toman como argumento un objeto, nos devolverán TRUE si este es del tipo que estamos verificando, y en caso contrario devolverán FALSE.

Función | Tipo que verifica | :--|:--| is.integer()| Entero | is.numeric()| Numérico | is.character()| Cadena de caracteres | is.logical()| Lógico | is.na() | Tipo con valor NA | is.null() | Tipo con valor NULL |

numero<-8
cat("El tipo de datos por defecto de un número es:",class(numero))
entero<-99
cat("¿El número",entero,"es entero?:",is.integer(entero))
flotante<-sqrt(2)
cat("¿El número",flotante,"es flotante?:",is.numeric(flotante))
cadena<-"Hola amigo"
cat("¿El tipo de datos de la cadena(",cadena,") es character?:",is.character(cadena))
logico<-8<9
cat("¿El tipo de datos del valor lógico",logico,"es lógico?...",is.logical(logico))
persona<-NULL
cat("¿Has encontrado a la persona buscada?",!(is.null(persona)))
edad<-NA
cat("¿Está disponible la edad?",!(is.na(edad)))
numero<-8
print("Estructura de un objeto numérico:")
str(numero)
cadena<-"Hola amigo"
print("Estructura de un objeto cadena:")
str(cadena)
logico<-8<9
print("Estructura de un objeto lógico")
str(logico)

Coerción explícita

El mecanismo de coerción puede ser hecho de forma explícita con la función as.() si es posible. En caso de tener éxito permite convertir de un tipo de datos a otro. En otro caso, se proporciona como resultado NA y la advertencia correspondiente.

Función | Tipo al que intenta convertir | :--|:--| as.integer()| Entero | as.numeric()| Numérico | as.character()| Cadena de caracteres | as.logical()| Lógico |

#Coerción explícita de número
numero<-8
cat("Convertimos",numero,"a lógico:",as.logical(numero))
cat("Convertimos",numero,"a cadena:",as.character(numero))
#Coerción explícita de cadena
cadena<-"Ocho"
cat("Convertimos",cadena," a lógico:",as.logical(cadena))
cat("Convertimos",cadena," a número:",as.numeric(cadena))
#Coerción explícita de lógico
logico<-TRUE
cat("Convertimos",logico," a cadena:",as.character(logico))
cat("Convertimos",logico," a número:",as.numeric(logico))

Los ejemplos muestran como existen conversiones que no se pueden llevar a cabo, implicando al tipo de datos cadena.

Paquetes

Ya sabemos que R puede ser expandido con paquetes. Cada paquete es una colección de funciones diseñadas para atender una tarea específica. Los paquetes se encuentran en el repositorio de CRAN.

knitr::include_graphics("images/paquetes.jpg")

R presenta funciones predefinidas que permiten la descarga, instalación y carga para su uso de todas las funciones incluidas en un paquete. Además, permite la carga para su uso de los conjuntos de datos predefinidos disponibles en un paquete.

Instalación y carga de paquetes y conjuntos de datos

Podemos instalar paquetes usando la función install.packages(), dando como argumento el nombre del paquete que deseamos instalar, entre comillas. Por ejemplo, vamos a instalar el paquete fun que contiene funciones que tienen implementados en R algunos juegos muy conocidos.

Vamos a hacerlo desde la consola de RStudio mediante install.packages("fun"). Como sabemos, aparecerán algunos mensajes en la consola mostrando el avance de la instalación para el paquete.

knitr::include_graphics("images/packages1.jpg")
knitr::include_graphics("images/packages2.jpg")

Una vez concluida la instalación de un paquete, se pueden usar sus funciones tras cargarlo mediante la función library(). Para ello, sólo hay que llamar a esta función usando como argumento el nombre del paquete a utilizar: en nuestro caso "fun", library("fun"). Lo haremos también en la consola.

knitr::include_graphics("images/packages3.jpg")

Cuando haces esto, R importa las funciones contenidas en el paquete al entorno de trabajo actual.

Es importante que tengas en mente que debes hacer una llamada a library() cada que inicies una sesión en R. Aunque hayas importado las funciones de un paquete con anterioridad, las sesiones de R se inician sólo con los objetos y funciones de base.

Vamos a probar algunas de las funciones del paquete fun. Previamente, vamos a abrir la ventana donde aparecerá el juego que invocaremos desde fun. Llamaremos a la función tecleando en la consola X11(type="Xlib") y se abrirá una ventana vacía. No cierres esa ventana por el momento.

knitr::include_graphics("images/packages4.jpg")
knitr::include_graphics("images/packages5.jpg")

Para probar el paquete llamaremos por ejemplo a la función que representa al buscaminas: mine_sweeper(). Lo haremos desde consola. Y el juego aparecerá automáticamente en la ventana que creamos anteriormente.

knitr::include_graphics("images/packages6.jpg")
knitr::include_graphics("images/packages7.jpg")
knitr::include_graphics("images/packages8.jpg")

Cuando el juego acabe o cerremos la ventana se devolverá el control automáticamente a la consola. Para volverlo a llamar debemos crear nuevamente otra ventana.

Puedes probar otros juegos o funciones del paquete fun como por ejemplo sliding_puzzle o gomoku. Recuerda crear la ventana antes de invocar a la función correspondiente. Para llamar a una función de un paquete determinado podemos indicar previamente el nombre del paquete correspondiente, por ejemplo fun::sliding_puzzle() o fun::gomoku(). Ello evitará ambigüedades en la interpretación del código, aunque en la mayoría de los casos no es imprescindible.

Los paquetes que hemos importado en nuestra sesión actual aparecen al llamar sessionInfo(). También podemos ver qué paquetes tenemos ya instalados ejecutando la función installed.packages() sin ningún argumento.

Para eliminar la carga de un paquete para ser usado (no supone desinstalarlo) se usa la función detach. Si la usamos con fun tendríamos lo siguiente: detach("package:fun",unload=TRUE).

Finalmente, para desinstalar un paquete podemos usar la función remove.packages(). El argumento que recibiría la función sería el nombre del paquete. En caso de usarlo con el paquete fun tendríamos lo siguiente: remove.packages("fun").

knitr::include_graphics("images/packages9.jpg")

Conjuntos de datos (datasets)

R dispone de varios conjuntos de datos (datasets) predefinidos. Se usan generalmente como datos de ejemplo o demostración para comprobar el funcionamiento de las diferentes funciones y paquetes en R.

Para ver una lista de los conjuntos de datos predefinidos disponibles en R, podemos usar la función data().

data()

Para cargar un determinado dataset puedes usar la misma función pasando como argumento el nombre del dataset que deseas cargar.

Puedes mostrar parte del contenido de un dataset usando la función head con cualquiera de la lista anterior (donde el nombre aparece en la primera columna).

head(mtcars)

Ayuda

R dispone de un sistema de ayuda que se puede invocar bien desde el menú que aparece al iniciar el programa RStudio (menú Help) o bien invocando la ayuda en línea a través de las funciones predefinidas.

R cuenta con un sistema de documentación accesible desde un conjunto de funciones predefinidas. Podemos consultar la documentación sobre algún término o una función particular, podemos especificar un paquete concreto del que deseamos ayuda o conocer su contenido o podemos buscar los ficheros de ayuda para una palabra o frase.

knitr::include_graphics("images/ayuda.jpg")

Vamos a comprobar algunos ejemplos de ayuda en línea que podemos obtener a través de las funciones predefinidas:

help.start()
#Ejemplo con función
help("toupper")
#Ejemplo con dataset
help("mtcars")
#Ejemplo del uso de ? para solicitar ayuda
?class
#Solicitud de ayuda para un paquete determinado
help(package="fun")
#Solicitud de ayuda para un operador determinado: operadores aritméticos
help("%%")
#Solicitud de las páginas de ayuda y demostraciones de código que contienen el término character
help.search("character")
#Funciones relacionadas con la función class
apropos("class")

No obstante, siempre podemos recurrir al menú Help de RStudio o a las secciones de Manuals, FAQS o Contributed localizados en el área de Documentation de CRAN project.

knitr::include_graphics("images/documentation.jpg")

Estadística

R presenta como predefinidas funciones estadísticas (paquete stats) relacionadas con:

knitr::include_graphics("images/estadistica.jpg")

Estadística básica

Las funciones estadísticas básicas, entre otras, son: Media, Mediana, Quantiles, Varianza y Desviación típica. Estas funciones se aplican sobre el tipo de datos vector, por lo que se debe conocer con más detalle este tipo de datos (está disponible un tutorial dedicado a este tipo de datos).

Veamos en la siguiente tabla algunas de las funciones más importantes de R orientadas a Estadística básica:

Función | Descripción | :--|:--| mean()| Media var()| Cuasi varianza sd()| Desviación típica median() | Mediana quantile() | Cuantiles fivenum() | Cuantiles boxplot.stats() | Cuantiles summary() | Mínimo y máximo, cuantiles 1 y 3, mediana y media

Como se puede observar existen varias funciones para calcular los cuantiles. La función que más se asemeja al cálculo usual a mano es boxplot.stats() y la función que se puede usar como un resumen de datos es summary().

Distribuciones discretas de probabilidad

Las funciones discretas de probabilidad que tiene incorporadas R por defecto se resumen a continuación:

Distribución | Función | Descripción :--|:--|:--| Binomial| dbinom() | Función de densidad - | pbinom() | Función de distribución acumulada - | qbinom() | Cuantiles binomiales - | rbinom() | Aleatorios binomiales Poisson | dpois() | Función de densidad - | ppois() | Función de distribución acumulada - | qpois() | Cuantiles de Poisson - | rpois() | Aleatorios Poisson Geométrica | dgeom() | Función de densidad - | pgeom() | Función de distribución acumulada - | qgeom() | Cuantiles geométrica - | rgeom() | Aleatorios geométrica Hipergeométrica | dhyper() | Función de densidad - | phyper() | Función de distribución acumulada - | qhyper() | Cuantiles hipergeométrica - | rhyper() | Aleatorios hipergeométrica Binomial negativa | dnbinom() | Función de densidad - | pnbinom() | Función de distribución acumulada - | qnbinom() | Cuantiles binomial negativa - | rnbinom() | Aleatorios binomial negativa

En estas funciones juega un papel muy importante el tipo de datos vector. Es necesario examinar el tutorial sobre este tipo de datos para comprender mejor su uso.

Distribuciones continuas de probabilidad

Las funciones continuas de probabilidad que tiene incorporadas R por defecto se resumen a continuación (nombre de la distribución, función de densidad, función de distribución, cuantiles y generación de aleatorios):

Distribución | Densidad | Distribución | Cuantiles | Aleatorios :--|:--|:--|:--|:--| Normal |dnorm()|pnorm()|qnorm() | rnorm() t-Student |dt()|pt()|qt() | rt() chi-Cuadrada |dchisq()|pchisq()|qchisq() | rchisq() F de Snedecor |df()|pf()|qf() | rf() Exponencial |dexp()|pexp()|qexp() | rexp() Uniforme |dunif()|punif()|qunif() | runif() Beta | dbeta()|pbeta()|qbeta() | rbeta() Cauchy |dcauchy()|pcauchy()|qcauchy() | rcauchy() Logística |dlogis()|plogis()|qlogis() | rlogis() Logarítmica normal |dlnorm()|plnorm()|qlnorm() | rlnorm() Gamma |dgamma()|pgamma()|qgamma() | rgamma() Weibull |dweibull()|pweibull()|qweibull() | rweibull() Gumbel |dgumbel()|pgumbel()|qgumbel() | rgumbel() Wilcoxon |dwilcox()|pwilcox()|qwilcox() | rwilcox() Tukey | - |ptukey()|qtukey() | -

En estas funciones juega un papel muy importante el tipo de datos vector. Es necesario examinar el tutorial sobre este tipo de datos para comprender mejor su uso.

Interválos de Confianza y Pruebas de Hipótesis Paramétricos.

R presenta funciones predefinidas realizar estudios paramétricos mediante interválos de confianza y pruebas de hipótesis de manera sencilla. Las funciones disponibles para tal propósito se muestran a continuación:

Función | Descripción :--|:--| t.test() | Estudio para la media. prop.test() | Estudio para la proporción.

Función | Descripción :--|:--| t.test() | Estudio de la diferencia de medias pareadas. t.test() | Estudio de la diferencia de medias independientes. var.test() | Estudio de igualdad de varianzas. prop.test()| Estudio de la diferencia de proporciones.

En estas funciones juega un papel muy importante el tipo de datos vector. Es necesario examinar el tutorial sobre este tipo de datos para comprender mejor su uso.

Análisis de regresión

En R es posible realizar varios tipos de análisis de regresión, dependiendo de la fórmula especificada y los parámetros a definir.

En nuestro caso, solamente indicaremos que la función predefinida para los modelos de análisis de regresión lineal es la función lm(). Esta función se usa para diseñar modelos de regresión lineal y puede ser utilizada para el análisis de la varianza y de covarianza.

Conclusión

R presenta una gran cantidad de funciones predefinidas con gran utilidad para la iniciación, desarrollo de aplicaciones, gestión de datos, realización de operaciones matemáticas y estadísticas y tiene herramientas para guiarnos en el proceso.

Felicidades, has completado el tutorial de Funciones predefinidas. Puedes continuar con el siguiente tutorial: Vectores.



eyeguas/fundamentosr documentation built on March 31, 2021, 5:20 p.m.