library(learnr) knitr::opts_chunk$set(echo = FALSE)
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.
El objetivo de aprendizaje del presente tutorial es el siguiente:
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:
toupper.toupper.toupper es la cadena de caracteres que deseamos convertir. Para llamar a la función proporcionándole como parámetro de entrada una cadena cadena_a_convertir (de tipo character) se rodea dicha entrada entre paréntesis tras el nombre de la función: toupper(cadena_a_convertir).toupper es la cadena de caracteres ya convertida a mayúscula. La salida de una función puede formar parte de una expresión o ser recogida en una variable mediante una asignación: cadena_mayuscula<-toupper(cadena_a_convertir).toupper está incluida dentro de uno de los paquetes base (chartr) incluidos por defecto en la instalación de R.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.
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")
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")
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):
tolower(): convierte en minúscula cualquier caracter en mayúscula de una cadena.toupper(): convierte en mayúscula cualquier caracter en minúscula de una cadena.casefold(): convierte en minúscula o mayúscula en función del parámetro recibido como argumento.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.
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:
width: longitud mínima de la cadena de salida.justify: controla donde se realiza el relleno de las cadenas para cumplir la longitud mínima dada por width. Puede recibir los valores de justificación del texto "left" (izquierda), "right" (derecha), "centre" (centro) y "none" (ninguna).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:
nsmall: número mínimo de dígitos significativos usados a la derecha del punto decimal.digits: número exacto de dígitos mostrados.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.
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.
Inf y NaNLos 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.
Las funciones predefinidas de signo más representativas en R son las siguientes:
Valor absoluto (abs): proporciona el valor absoluto de la expresión recibida como argumento. Por ejemplo: el valor absoluto de -5 se calcularía como abs(-5), siendo 5 el valor devuelto por la función.
Signo (sign): proporciona el signo de la expresión recibida como argumento. La función puede proporcionar como resultado tres salidas diferentes:
1: que indica signo positivo. Ej: sign(33).0: que indica que no hay signo. Ej: sign(47-33-14).-1: que indica signo negativo. Ej: sign(4-29).
Raíz cuadrada (sqrt): calcula la raíz cuadrada de la expresión recibida como argumento. Si la expresión es negativa el resultado es un número complejo.
sqrt(9) proporcionaría como resultado 3.sqrt(-1) proporcionaría como resultado NaN (del inglés, not-a-number). Como sabéis, los números complejos se inventaron para poder trabajar con raíces cuadradas de números negativos. Ahora bien, por defecto, cuando calculamos la raíz cuadrada de un número negativo R no devuelve un número complejo, sino que se limita a avisarnos de que no existe. sqrt(as.complex(-1)) proporcionaría como resultado 0+1i (número complejo). Cuando insertamos en R un número complejo escrito en forma binomial a+bi no escribimos un * entre la i y su coeficiente. Si el coeficiente es 1 es necesario escribirlo y no basta con indicarlo únicamente como i. 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),".")
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.
Existen distintas maneras, matemáticamente hablando, de redondear o truncar un valor a través de las funciones predefinidas de R:
round: nos devuelve un valor numérico redondeado a los dígitos que indicamos. Se trata del redondeo más usado en el que cuando el decimal que sigue al último que se mostrará es 5 o mayor de 5 entonces se se redondea hacia arriba y hasta 5 redondea hacia abajo. La función round recibe dos valores como argumento: valor_a_redondear que es el número o expresión que deseamos redondear, y numero_decimalesque representa el número de decimales del número redondeado a obtener.
round(valor_a_redondear,numero_decimales)
#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),".")
ceiling: devuelve el primer entero mayor al número o expresión recibida como argumento: numero.
ceiling(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),".")
floor: devuelve el primer entero menor al número o expresión recibida como argumento: numero.
floor(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),".")
trunc: devuelve la parte entera correspondiente al número o expresión recibida como argumento: numero.
trunc(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),".")
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)))
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:
ls(): lista todas las variables definidas en el entorno. Vamos a mostrar un ejemplo en el que definiremos varias variables e invocaremos a esta función para mostrar sus nombres (no sus valores). Obviamente el valor de cada variable se puede obtener mediante su nombre o al visualizarla por pantalla.logica<-TRUE numerica<-9.7 entera<-6 cadena<-"Hola" ls()
rm(): elimina del entorno actual la variable o variables proporcionadas como argumento. Para eliminar todas las variables del entorno, hemos de proporcionar como argumento el correspondiente a la función que lista los nombres de todas las variables del entorno (list=ls()). En los siguientes ejemplos puedes hacer uso del comentario al principio de línea para comprobar el efecto de la función rm() (por ejemplo, si comentas la línea de rm() todas las variables se visualizarán y si comentas la línea de la variable que no se encuentra, tienes la posibilidad de ver qué ocurre con las siguientes variables).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
getwd(): devuelve el directorio de trabajo actual. El directorio o carpeta de trabajo es el lugar en nuestra computadora en el que se encuentran los archivos con los que estamos trabajando en R. Este es el lugar donde, por defecto, R buscara archivos para importarlos y al que serán exportados. Se mostrará en la consola la ruta del directorio que está usando R.
setwd(): permite cambiar el directorio de trabajo, dando como argumento la ruta del directorio que se desea usar como nueva carpeta de trabajo.
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)
list.files(): presenta el contenido del directorio de trabajo, devolviendo una lista con el nombre de los archivos del directorio de trabajo.
list.dirs(): proporciona una lista de los directorios o carpetas dentro del directorio o carpeta de 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.
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 NULLEn 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.
Las funciones predefinidas que permiten consultar el tipo de datos de un objeto en R son las siguientes:
class(): se usa para determinar el tipo de datos de un objeto. Su utilidad es la de asegurarnos que las operaciones que deseamos realizar tendrán los datos apropiados para llevarse a cabo con éxito. Recibe como argumento un objeto y devuelve el nombre del tipo al que pertenece. 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)))
str(): muestra los detalles acerca de la estructura, contenido y tipo de datos del objeto proporcionado como argumento. Tiene mayor utilidad cuando se utiliza con objetos correspondientes a tipos de datos compuestos. 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)
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.
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.
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")
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)
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(): inicializa un manual de ayuda completo en formato html, utilizando el navegador del sistema.help.start()
help(funcion_o_dataset): muestra una ventana de ayuda acerca de la función o dataset pasado como argumento.#Ejemplo con función help("toupper")
#Ejemplo con dataset help("mtcars")
?: lo mismo que help(funcion_o_dataset) pero disponiendo a continuación aquello de lo que queremos solicitar ayuda. #Ejemplo del uso de ? para solicitar ayuda ?class
help(package=nombre_paquete): muestra la ayuda del paquete proporcionado como argumento consistente en la descripción del mismo, autor, versión, resumen de las funciones que contiene, etc.#Solicitud de ayuda para un paquete determinado help(package="fun")
help(operador): muestra ayuda acerca de un operador o una familia de operadores en R consistente en la descripción, uso, argumentos, detalles de operación, limitaciones de uso, etc.#Solicitud de ayuda para un operador determinado: operadores aritméticos help("%%")
help.search(cadena): busca ayuda sobre objetos o funciones que tengan nombre o título que contenga la cadena proporcionada como argumento (páginas de ayuda, demostraciones de código, etc.).#Solicitud de las páginas de ayuda y demostraciones de código que contienen el término character help.search("character")
apropos(funcion): muestra las funciones relacionadas con la funcion proporcionada como argumento.#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")
R presenta como predefinidas funciones estadísticas (paquete stats) relacionadas con:
knitr::include_graphics("images/estadistica.jpg")
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().
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.
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.
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.
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.
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.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.