1. Introducción

Al hablar de R, debemos tener presente que por una parte podemos hablar de un lenguaje de programación y por otra parte podemos hablar de un entorno, desarrollado en el lenguaje R, que integra un conjunto de programas para la manipulación de datos, la realización de cálculos y análisis de los mismos y su representación gráfica. Por lo tanto debemos entender que R tiene una doble naturaleza, como lenguaje y como entorno.

R, como lenguaje de programación, fue desarrollado por los neozelandeses Ross Ihaka y Robert Gentleman, en 1996, como un dialecto del lenguaje S, que había sido creado a principios de los años 90 del Siglo XX por los Laboratorios AT&T Bell.

Sobre la base de la distribución de R, bajo Licencia Pública General GNU, que realizaron sus creadores, surgió a su alrededor una amplia comunidad de usuarios, que, de manera desinteresada, comenzaron a desarrollar y publicar distintas rutinas y librerías (macros) que facilitaban la realización de procesos recurrentes a la hora de trabajar con este lenguaje de programación: los accesos de consulta/escritura a ficheros de datos, las operaciones matemáticas o, entre muchas otras, la representación gráfica de los datos.

2. Instalación de R y Rstudio

La manera de instalar R cambia dependiendo del sistema operativo utilices pero todas tienen en común el uso de CRAN.

CRAN es el The Comprehensive R Archive Network, una red en la que se archivan todas las versiones de R base, así como todos los paquetes para R que han pasado por un proceso de revisión riguroso, realizado por el CRAN Team, que se encarga de asegurar su correcto funcionamiento.

El sitio oficial de CRAN, en el que encontrarás más información sobre este repositorio es el siguiente:

https://cran.r-project.org/

Pasos para instalar R:

  1. Se da click en download R, despues de eso aparece una lista de todos los servidores de los cuales se puede descargar R.

  2. Luego Install R for first time.

  3. Finalmente descargamos la última versión que es la R 4.0.5.

Aunque podemos usar R directamente, es recomendable instalar y usar un entorno integrado de desarrollo (IDE, por sus siglas en inglés).

Un IDE nos proporciona herramientas para escribir y revisar nuestro código, administrar los archivos que estamos usando, gestionar nuestro entorno de trabajo y algunas otras herramientas de productividad. Tareas que serían difíciles o tediosas de realizar de otro modo, son fáciles a través de un IDE.

Hay varias opciones de IDE para R, y entre ellas mi preferido es RStudio. Este entorno, además de incorporar las funciones esenciales de una IDE, es desarrollado por un equipo que ha contribuido de manera significativa para lograr que R sea lenguaje de programación más accesible, con un énfasis en la colaboración y la reproducción de los análisis.

Para instalar RStudio, es necesario con descargar y ejecutar alguno de los instaladores disponibles en su sitio oficial. Están disponibles versiones para Windows, OSX y Linux.

https://www.rstudio.com/products/rstudio/download/#download

3. Descripción del entorno de RStudio

Se pueden ver 4 ventanas, además de la barra de opciones en la parte superior.

  • Ventana (1): es el editor de sintaxis: se trata del lugar donde editamos la sintaxis para posteriormente ejecutarla. Al escribir allí no sucederá nada, a no ser que se apriete algún botón para ejecutar los comandos o la tecla ctrl+enter.

  • Ventana (2): es el “entorno de trabajo” del programa: en este lugar se muestra el conjunto de datos y los “objetos” (resultados, variables, gráficos, etc.) que se almacenan al ejecutar diferentes análisis.

  • Ventana (3) tiene varias sub pestañas: (i) la pestaña files permite ver el historial de archivos trabajados con el programa; (ii) la pestaña plots permite visualizar los gráficos que se generen; (iii) la pestaña packages permite ver los paquetes descargados y guardados en el disco duro así como gestionar su instalación o actualización; (iv) la ventana help permite acceder al CRAN - Comprehensive R Archive Network (siempre que se cuente con conexión a Internet), página oficial del software que ofrece diferentes recursos para el programa: manuales para el usuario, cursos on line, información general, descarga de paquetes, información de los paquetes instalados, etc. Esta última pestaña es bastante útil: empleando el motor de búsqueda se accede de manera rápida a manuales de uso de los diferentes paquetes (y sus funciones) instalados en el computador (esto no requiere conexión a Internet).; (v) la ventana viewer muestra los resultados al construir reportes mediante funcionalidades tipo rmarkdown.

  • Ventana (4): es la consola. Corresponde a lo que sería el software R en su versión básica. Allí el software ejecuta las operaciones realizadas desde el editor de sintaxis.

4. Manejo de la biblioteca y gestión de paquetes

4.1 Descargar paquetes

La descarga e instalación de paquetes adicionales a la versión básica de R se realiza mediante el comando install.packages() indicando entre comillas el nombre del paquete a descargar. Este comando conecta la sesión de R directamente con el CRAN y descarga al computador.

En el siguiente ejemplo se descarga el paquete readxl que permite abrir bases de datos desde formato Excel en la sesión de R.

install.packages("readxl")

4.2 Cargar paquetes

Ya se ha indicado que R funciona en la memoria temporal del programa (memoria RAM). Esto hace que cada vez que se abre el programa (vía RStudio) éste se despliega en su versión básica. Es por ello que no basta con descargar al disco duro los paquetes para poder utilizarlos. Para usar una función correspondiente a un paquete adicional a la versión básica de R tal paquete se debe cargar en la sesión de R en que se está trabajando.

Esto se efectúa con el comando library() indicando entre paréntesis el nombre del paquete a cargar. A diferencia de la función install.packages acá el nombre del paquete no se indica entre comillas.

library(readxl) #Carga el paquete descargado a la sesión de trabajo de R.

4.3 Actualizar la versión básica de R y los paquetes instalados

R está en permanente actualización por lo que luego de algunos meses la versión que haya sido instalada quedará desactualizada. Cada versión busca introducir mejoras, robustecer funciones ya existentes, etc.

Es posible efectuar una actualización del software mediante la función updateR(). Esta función es parte del paquete installr y funciona solamente para el sistema operativo Windows. Como se observa en las siguientes líneas de comando, se trata de un procedimiento simple.

install.packages("installr")

library(installr)

updateR()

Así como el software R, los paquetes están sujetos a permanentes actualizaciones y mejoras. Por ello, también es preciso conocer alguna forma de actualizar de manera rápida y simultánea todos los paquetes que estén instalados en el disco duro. Para ello, se sugiere utilizar el siguiente comando.

update.packages()

Nota: No es necesario ejecutar el comando install.packages cada vez que se requiera usar un paquete adicional a la versión básica de R. Basta con hacerlo una sola vez pues los paquetes se descargan al disco duro del computador, quedando almacenados allí. Lo que se precisa es cargarlos en la sesión temporal de R cada vez que se abra una sesión nueva donde no hayan sido cargados previamente.

5. Leer datos

5.1 Datasets de base

R contiene datasets que pueden ser utilizados directamente. Para dar un vistazo a los paquetes

paquetes <- library(help = "datasets")
head(paquetes$info[[2]])

5.2 Importar datos de manera manual

Rstudio posee una pestaña en donde tenemos el Entorno y un botón que nos permite importar datasets (ver figura). Desaconsejo utilizar esta pestaña de manera recurrente debido a que es de poca utilidad para leer archivos grandes. Además, aprender a importar archivos usando código nos permite leer múltiples archivos con gran velocidad, tarea prácticamente imposible si utilizamos los cuadros de diálogo.

5.3 Archivos de texto

La gran ventaja de mantener archivos de texto (por ejemplo, .csv o .txt) es que una enorme cantidad de software es capaz de leerlos y no están ligados a un sistema operativo.

R tiene funciones genéricas para abrir este tipo de archivos en una tabla como read.table(…). Esta función presume pocas cosas en la estructura de datos, por lo que permite especificar un montón de parámetros y nos brinda variabilidad (ver help(read.table)). Sin embargo, en general conocemos la estructura de nuestros datos (por ejemplo, la primera fila es el título de las columnas o es un archivo separado por comas). Por lo tanto, usaremos llamadas del estilo:

datos <- read.csv(file = 'nombre_de_archivo.csv',sep = ",")

Un archivo separado por tabulaciones (.txt) puede leerse como:

datos <- read.table(file = 'nombre_de_archivo.txt', sep = '\t')

5.4 Desde la web

Es posible utilizar una URL para leer datos. Es necesario conocer la dirección directa al archivo de texto y su extensión.

datos <- read.table("http://www.algunapagina.com/datos/nombre-archivo.txt")

5.4 SAS

Si jugaron con los cuadros de diálogo para importar datos de forma manual, probablemente se toparon con el paquete haven, por ejemplo podemos leer desde SAS usando:

library(haven)
dataset <- read_sas(...)

También es posible usar foreign y la función read.ssd().

5.5 SPSS

R puede leer datos directamente de spss:

  • El paquete foreign contiene la función read.spss().
  • El paquete haven y la función read_spss().

5.6 Excel

En algún momento tendremos que leer datos en la forma .xls o .xlsx. Existen distintos paquetes que permiten realizar la tarea, por ejemplo:

  • readxl contiene la función read_excel(), entre otras.
  • xlsx contiene la función read.xlsx(), entre otras.

5.7 Copiando directamente de la base de datos

Una alternativa sencilla y muy útil por la diversidad de aplicaciones que tiene, ya que puede ser empleada cuando se tenga la información en alguna de las siguientes maneras: formato texto, EXCEL, SPSS, e inclusive cuando se desea transcribir un cuadro en Word; viene dada de la siguiente manera:

Objeto <- read.delim( “clipboard”)

6. Consola de RStudio

Lo primero que nos encontramos al ejecutar R es una pantalla que nos muestra la versión de este lenguaje que estamos ejecutando y un prompt:

>_

6.1 Ejecutar, llamar, correr y devolver

Cuando hablamos de ejecutar, llamar o correr nos referimos a pedir que R realice algo, en otras palabras, estamos dando una instrucción o una entrada.

Cuando decimos que R nos devuelve algo, es que ha realizado algo que le hemos pedido, es decir, nos está dando una salida.

Por ejemplo, si escribimos los siguiente en la consola lo siguiente y damos Enter, estamos pidiendo que se ejecute esta operación:

1+1
## [1] 2

6.2 Objetos

En R, todo es un objeto. Todos los datos y estructuras de datos son objetos. Además, todos los objetos tienen un nombre para identificarlos.

La explicación de esto es un tanto compleja y se sale del alcance de este libro. Se relaciona con el paradigma de programación orientada a objetos y ese es todo un tema en sí mismo.

Lo importante es que recuerdes que al hablar de un objeto, estamos hablando de cualquier cosa que existe en R y que tiene un nombre.

6.3 Funciones

Una función es una serie de operaciones a la que les hemos asignados un nombre. Las funciones aceptan argumentos, es decir, especificaciones sobre cómo deben funcionar.

Cuando llamamos una función, se realizan las operaciones que contiene, usando los argumentos que hemos establecido.

En R reconocemos a una función usando la notación: nombre_de_la_función(). Por ejemplo:

mean()
quantile()
summary()
density()
c()

Al igual que con las variables, se recomienda que los nombres de las funciones sean claros, no ambiguos y descriptivos. Idealmente, el nombre de una función describe lo que hace. De hecho, es probable que adivines qué hacen casi todas funciones de la lista de arriba a partir de su nombre.

6.3 Documentación

Las funciones de R base y aquellas que forman parte de paquete tienen un archivo de documentación.

Este archivo describe qué hace la función, sus argumentos, detalles sobre las operaciones que realiza,los resultados que devuelve y ejemplos de uso.

Para obtener la documentación de una función, escribimos el ? antes de su nombre y lo ejecutamos. También podemos usar la función help(), con el nombre de la función.

Los dos procedimientos siguientes son equivalentes.

?mean()

help("mean")

6.4 Directorio de trabajo

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 R buscara archivos para importarlos y al que serán exportados, a menos que indiquemos otra cosa.

Puedes encontrar cuál es tu directorio de trabajo con la función getwd(). Sólo tienes que escribir la función en la consola y ejecutarla.

getwd()

Puedes cambiar el directorio de trabajo usando la función setwd(), dando como argumento la ruta del directorio que quieres usar.

setwd("C:\otro_directorio")

6.5 Otras instrucciones a tener en cuenta

Durante una sesión de trabajo con R, los objetos que se crean se almacenan por nombre.

Para la obtención de los nombres de todos los objetos almacenados en R, se emplea cualquiera de las siguientes instrucciones:

ls()
objects()
  • Para borrar un objeto en particular
rm(Nombre del objeto)
  • Para borrar todos los objetos
rm(list = ls())
  • Para salir del programa
q()
  • Para observar los gráficos en R
demo(graphics)
  • Busca ayuda sobre X
help(X)
  • Para observar el contenido de un objeto
print()
  • Limpiar la pantalla Presione las teclas ctrl y l, al tiempo.

7. Tipos de datos

En R los datos pueden ser de diferentes tipos. Cada tipo tiene características particulares que lo distinguen de los demás. Entre otras cosas algunas operaciones sólo pueden realizarse con tipos de datos específicos.

Tipo Ejemplo Nombre en inglés
Entero 1 integer
Numérico 1.3 numeric
Cadena de texto “uno” character
Factor uno factor
Lógico TRUE logical
Perdido NA NA
Vacio NULL null

7.1 Entero y numérico

Como su nombre lo indica, los datos enteros representan números enteros, sin una parte decimal o fraccionaria, que pueden ser usados en operaciones matemáticas.

Por su parte, como su nombre lo indica, los datos numéricos representan números, la diferencia de estos con los datos enteros es que tiene una parte decimal o fraccionaria.

Los datos numéricos también son llamados doble o float (flotantes). Este nombre se debe a que, en realidad, son números de doble precisión, pues tienen una parte entera y una fraccionaria decimal, y son llamados float debido a que se usa un punto flotante para su representación computacional.

7.2 Cadena de texto

El tipo character representa texto y es fácil reconocerlo porque un dato siempre esta rodeado de comillas, simples o dobles. De manera convencional, nos referimos a este tipo de datos como cadenas de texto, es decir, secuencias de caracteres.

Este es el tipo de datos más flexible de R, pues una cadena de texto puede contener letras, números, espacios, signos de puntuación y símbolos especiales.

7.3 Factor

Un factor es un tipo de datos específico a R. Puede ser descrito como un dato numérico representado por una etiqueta.

Supongamos que tenemos un conjunto de datos que representan el sexo de personas encuestadas por teléfono, pero estos se encuentran capturados con los números 1 y 2. El número 1 corresponde a femenino y el 2 a masculino.

En R, podemos indicar que se nos muestre, en la consola y para otros análisis, los 1 como femenino y los 2 como masculino. Aunque para nuestra computadora, femenino tiene un valor de 1, pero a nosotros se nos muestra la palabra femenino. De esta manera reducimos el espacio de almacenamiento necesario para nuestros datos.

Este comportamiento es similar a lo que ocurre con paquetes estadísticos comerciales como SPSS Statistics, en los que podemos asignar etiquetas a los datos, dependiendo de su valor. La diferencia se encuentra en que R trata a los factores de manera diferente a un dato numérico.

Por último, cada una de las etiquetas o valores que puedes asumir un factor se conoce como nivel. En nuestro ejemplo con femenino y masculino, tendríamos dos niveles.

7.4 Lógico

Los datos de tipo lógico sólo tienen dos valores posibles: verdadero (TRUE) y falso (FALSE). Representan si una condición o estado se cumple, es verdadero, o no, es falso.

7.5 NA y NULL

En R, usamos NA para representar datos perdidos, mientras que NULL representa la ausencia de datos.

La diferencia entre las dos es que un dato NULL aparece sólo cuando R intenta recuperar un dato y no encuentra nada, mientras que NA es usado para representar explícitamente datos perdidos, omitidos o que por alguna razón son faltantes.

Por ejemplo, si tratamos de recuperar la edad de una persona encuestada que no existe, obtendríamos un NULL, pues no hay ningún dato que corresponda con ello. En cambio, si tratamos de recuperar su estado civil, y la persona encuestada no contestó esta pregunta, obtendríamos un NA.

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

7.6 Coerción

En R, los datos pueden ser coercionados, es decir, forzados, para transformarlos de un tipo a otro.

La coerción es muy importante. Cuando pedimos a R ejecutar una operación, intentará coercionar de manera implícita, sin avisarnos, los datos de su tipo original al tipo correcto que permita realizarla. Habrá ocasiones en las que R tenga éxito y la operación ocurra sin problemas, y otras en las que falle y obtengamos un error.

Lo anterior ocurre porque no todos los tipos de datos pueden ser transformados a los demás, para ello se sigue una regla general.

La coerción de tipos se realiza de los tipos de datos más restrictivos a los más flexibles.

Las coerciones ocurren en el siguiente orden.

lógico -> entero -> numérico -> cadena de texto (logical -> integer -> numeric -> character)

Las coerciones no pueden ocurrir en orden inverso. Podemos coercionar un dato de tipo entero a uno numérico, pero uno de cadena de texto a numérico.

Como los datos de tipo lógico sólo admiten dos valores (TRUE y FALSE), estos son los más restrictivos; mientras que los datos de cadena de texto, al admitir cualquier cantidad y combinación de caracteres, son los más flexibles.

Los factores son un caso particular para la coerción. Dado que son valores numéricos con etiquetas, pueden ser coercionados a tipo numérico y cadena de texto; y los datos numéricos y cadena de texto pueden ser coercionados a factor. Sin embargo, al coercionar un factor tipo numérico, perdemos sus niveles.

Coerción explícita con la familia as()

También podemos hacer coerciones explícitas usando la familia de funciones as().

Función Tipo al que hace coerción
as.integer() Entero
as.numeric() Numerico
as.character() Cadena de texto
as.factor() Factor
as.logical() Lógico
as.null() NULL

8. Verificar el tipo de un dato

En ocasiones, tenemos datos pero no sabemos de simple vistazo de qué tipo son. Para esto casos, podemos usar la función class() para determinar el tipo de un dato. Esto es de utilidad para asegurarnos que las operaciones que deseamos realizar tendrán los datos apropiados para llevarse a cabo con éxito.

Por ejemplo, verificamos el tipo de datos que son 10, “a” y TRUE.

class(10)
## [1] "numeric"
class("a")
## [1] "character"
class(TRUE)
## [1] "logical"

9. Operadores

9.1 Operadores aritméticos

Como su nombre lo indica, este tipo de operador es usado para operaciones aritméticas.

Operador Operación
+ suma
- resta
* multiplicación
/ división
^ potencia
%% división entera

9.2 Operadores relacionales

Los operadores lógicos son usados para hacer comparaciones y nos arrojan si son TRUE o FALSE

Operador Operación
< menor que
<= menor o igual que
> mayor que
>= mayor o igual que
== exactamente igual que
!= no es igual que

9.3 Operadores lógicos

Los operadores lógicos son usados para operaciones de álgebra Booleana, es decir, para describir relaciones lógicas.

Operador Operación
x \(|\) y x Ó y es verdadero
x & y x Y y son verdaderos
!x x no es verdadero
isTRUE(x) x es verdadero (afirmación)

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

9.4 Operadores de asignación

Este es probablemente el operador más importante de todos, pues nos permite asignar datos a variables.

Operador Operación
<- asigna un valor a una variable
= asigna un valor a una variable

9.5 Orden de operaciones

En R, al igual que en matemáticas, las operaciones tienen un orden de evaluación definido.

Cuanto tenemos varias operaciones ocurriendo al mismo tiempo, en realidad, algunas de ellas son realizadas antes que otras y el resultado de ellas dependerá de este orden.

El orden de operaciones incluye a las aritméticas, relacionales, lógicas y de asignación.

Orden Operador
1 ^
2 * /
3 + -
4 < > <= >= == !=
5 !
6 &
7 \(|\)
8 <-

10. Estructuras de datos

En R prácticamente todos los datos pueden ser tratados como objetos, incluidos los tipos de datos más simples como son los números o los caracteres. Entre los tipos de datos disponibles tenemos vectores, matrices, factors, data frames y listas.

Las estructuras de datos básicas de R pueden agrupar por su dimensionalidad y según si son homogéneas (todos los elementos son del mismo tipo) o heterogéneas (hay elementos de distintos tipos). En el siguiente cuadro se resumen estas:

Dimensiones Homogéneas Heterogéneas
1 vector simple Lista
2 matriz data frame
n array

10.1 Vectores

Como su nombre lo indica son conjuntos de números separados por comas, y la representación para su acceso al sistema es c( ). Dentro del paréntesis, se colocan los valores para la variable cuantitativa, cuyo nombre identifica al vector, el cual se reconoce en general como un objeto.

Los objetos se pueden clasificar en dos grandes grupos:

  • atomics: todos los elementos que los componen son del mismo modo, como por ejemplo los vectores, matrices, series temporales.

  • recursivos: pueden combinar una colección de otros objetos de diferente tipo, como son los data.frame, y las listas.

Algunos ejemplos de vectores son:

Ejemplo

Crear un vector de 10 elementos y definirlo como un objeto llamado edad.

edad=c(45,25,30,34,28,42,24,38,40,35)
edad
##  [1] 45 25 30 34 28 42 24 38 40 35

10.1.1 Vector lógico

El conjunto de valores proviene de una variable cualitativa, del tipo dicotómico, que toma dos valores Verdadero, Falso, que corresponden a las palabras en inglés True (T), False (F).

Ejemplo

Crear un vector de 5 elementos y asignarlo a la variable (objeto) X.

X<-c(T,F,T,T,F)
X
## [1]  TRUE FALSE  TRUE  TRUE FALSE

10.1.2 Vector de caracteres

Al igual que en el caso anterior, el vector de caracteres obedece a una variable nominal, pero con una gama de valores no numéricos más amplia.

Ejemplo

Crear un vector para el departamento de origen de 6 estudiantes.

municipio<-c("San Salvador","Santa Ana","Usulután","Ahuachapán","San Miguel","La Libertad")
municipio
## [1] "San Salvador" "Santa Ana"    "Usulután"     "Ahuachapán"   "San Miguel"  
## [6] "La Libertad"

10.1.3 Asignación de nombres a los elementos de un vector

Se usa la instrucción names()

Ejemplo

names(edad)<- c("a","b","c","d","e","f","g","h","i","j")
edad
##  a  b  c  d  e  f  g  h  i  j 
## 45 25 30 34 28 42 24 38 40 35

10.1.4 Creación de patrones

Para simplificar la escritura de vectores existen varias órdenes con las cuales se crean de un modo automático:

  1. from:to # Desde un Número a otro.

Ejemplo

Crear la secuencia de 1 a 5

1:5
## [1] 1 2 3 4 5
  1. seq() # Cumple el mismo papel del comando anterior, adicionalmente puede llevar un elemento que indique el incremento deseado.

Ejemplo

  1. Genera los números entre 1 y 6.
seq(1,6)
## [1] 1 2 3 4 5 6
  1. Suma al número anterior 0.5 hasta que se llega a 6, empezando en 1.
seq(1,6,by=0.5)
##  [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0
  1. rep() # Para repetir patrones una cierta cantidad de veces.

Ejemplo

  1. Repetir el 1 cinco veces.
rep(1,5) 
## [1] 1 1 1 1 1
  1. Repetir el patrón (1,2) cinco veces.
rep(c(1,2),5) 
##  [1] 1 2 1 2 1 2 1 2 1 2
  1. Repetir el patrón de 1 a 4, dos veces
rep(1:4,2)
## [1] 1 2 3 4 1 2 3 4

10.1.5 Extracción de elementos de un vector

Hay cuatro maneras de seleccionar elementos de un vector, y son:

  1. Especificar los índices de los elementos a extraer:

Ejemplo

La orden extrae los elementos 1, 3 y 6 del vector edad.

edad[c(1,3,6)]
##  a  c  f 
## 45 30 42
  1. Un número negativo precediendo al índice significa exclusión. Con el vector edad creado anteriormente:
  1. Extrae todos los elementos del vector edad menos el tercero.
edad[-3]
##  a  b  d  e  f  g  h  i  j 
## 45 25 34 28 42 24 38 40 35
  1. Extrae los elementos del vector edad menos el primero y el segundo.
edad[-c(1,2)]
##  c  d  e  f  g  h  i  j 
## 30 34 28 42 24 38 40 35
  1. Especificar una condición lógica.
  1. Calificar como verdadero (mayor que 10) o falso (menor o igual de 10) cada uno de los elementos del vector edad.
edad > 30
##     a     b     c     d     e     f     g     h     i     j 
##  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE
  1. Extraer todos los elementos que cumplan la condición.
edad[edad>30]
##  a  d  f  h  i  j 
## 45 34 42 38 40 35
  1. En el caso de un vector de variables cualitativas, se utilizan los nombres de las variables para extraer los elementos:
  1. Leer o extraer el primer elemento del vector municipio
municipio[1]
## [1] "San Salvador"
  1. Leer los dos últimos municipios
municipio[5:6]
## [1] "San Miguel"  "La Libertad"

10.2 Factores

Un uso importante de los atributos es la creación de variables tipo \(factor\), el cual es un tipo de dato que solo puede contener una cantidad predefinida de elementos, y es usado para almacenar variables categóricas. Los factores están caracterizados por dos atributos: el atributo \(class\), que toma el valor factor, y el atributo \(levels\), que define los valores que puede tomar la variable.

  1. Sea un vector de caracteres que incluye los países de sudamérica.
paises=c("Argentina","Perú","Brasil","Argentina","Brasil","Ecuador",
         "Ecuador","Colombia")
paises
## [1] "Argentina" "Perú"      "Brasil"    "Argentina" "Brasil"    "Ecuador"  
## [7] "Ecuador"   "Colombia"
class(paises)
## [1] "character"
  1. Transformar una variable caracter a una de factor.
sudamerica=factor(paises)
sudamerica
## [1] Argentina Perú      Brasil    Argentina Brasil    Ecuador   Ecuador  
## [8] Colombia 
## Levels: Argentina Brasil Colombia Ecuador Perú
class(sudamerica)
## [1] "factor"
  1. Crear un vector numérico de IMC.
IMC=c(1,2,1,3,4,2,1,2,3,4,4,2)
IMC
##  [1] 1 2 1 3 4 2 1 2 3 4 4 2
class(IMC)
## [1] "numeric"
  1. Convertir el vector numérico a un factor.
IMCAGRUP=factor(IMC,levels = c(1,2,3,4),labels = c("Normal","Sobrepeso","Obesidad","Obesidad I"))
IMCAGRUP
##  [1] Normal     Sobrepeso  Normal     Obesidad   Obesidad I Sobrepeso 
##  [7] Normal     Sobrepeso  Obesidad   Obesidad I Obesidad I Sobrepeso 
## Levels: Normal Sobrepeso Obesidad Obesidad I
class(IMCAGRUP)
## [1] "factor"
  1. Factores ordenados. Son factores cuyos niveles guardan un determinado orden. Para crear un factor ordenado o para transformar un factor en ordenado se usa la función \(ordered()\).
pct <- c("alto","bajo","bajo","medio","alto","medio","bajo","alto","alto","alto")
fpct=factor(pct)
fpct
##  [1] alto  bajo  bajo  medio alto  medio bajo  alto  alto  alto 
## Levels: alto bajo medio
table(fpct)
## fpct
##  alto  bajo medio 
##     5     3     2
ordfpct=ordered(fpct,levels=c("bajo","medio","alto"))
ordfpct
##  [1] alto  bajo  bajo  medio alto  medio bajo  alto  alto  alto 
## Levels: bajo < medio < alto
table(ordfpct)
## ordfpct
##  bajo medio  alto 
##     3     2     5
  1. En muchas ocasiones nos interesa ver el orden de la variable que le indicaremos cual será nuestro valor de referencia, ya que sino se lo pedimos al programa el asumirá según el orden alfabético, para ello utilizamos el comando \(relevel()\).
sex <- c("F", "F", "F", "F", "M", "M")
sex.factor <- factor(sex, labels=c("Femenino", "Masculino"))
sex.factor <- relevel(sex.factor, ref="Femenino")
summary(sex.factor)
##  Femenino Masculino 
##         4         2

10.3 Matrices

Una matriz en R, es un conjunto de objetos indizados por filas y columnas. Equivale a decir que es un arreglo de vectores. Los datos que contiene una matriz deben ser todos del mismo tipo: todos numéricos, o de tipo carácter o lógico, pero no mezclados.

La sintaxis general de la orden para crear una matriz es la siguiente:

matrix(data, nrow, ncol, byrow=F)

donde:

  • data: datos que forman la matriz
  • nrow: número de filas de la matriz
  • ncol: número de columnas de la matriz
  • byrow: los datos se colocan por filas o por columnas según se van leyendo.
  1. Crear una matriz con 8 elementos. Al no especificarse nada, se entiende que se desea crear un vector columna y así los coloca por defecto.
matrix(1:8) 
##      [,1]
## [1,]    1
## [2,]    2
## [3,]    3
## [4,]    4
## [5,]    5
## [6,]    6
## [7,]    7
## [8,]    8
  1. Se indica el número de filas
matrix(1:8,nrow=4) 
##      [,1] [,2]
## [1,]    1    5
## [2,]    2    6
## [3,]    3    7
## [4,]    4    8
  1. byrow=T: señala que se construya por filas
matrix(1:8,nrow=4,byrow=T) 
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    4
## [3,]    5    6
## [4,]    7    8
  1. En las matrices podemos tambien ponerles nombre a las filas y a las columnas con los comandos rownames() y colnames() respectivamente.
datos <- matrix(c(20,65,174,22,70,180,19,68,170), nrow=3, byrow=T)
colnames(datos) <- c("edad","peso","altura")
rownames(datos) <- c("José","Alan","Francisco")
datos
##           edad peso altura
## José        20   65    174
## Alan        22   70    180
## Francisco   19   68    170
  1. El acceso a los elementos de una matriz es similar al caso de los vectores. Se usa el mismo operador [], pero en este caso se esperan dos parámetros separados por una coma: la fila y la columna.
datos[,"edad"] # edad de todas las personas
##      José      Alan Francisco 
##        20        22        19
datos["Francisco",] # variables del individuo "Francisco" 
##   edad   peso altura 
##     19     68    170
datos[,c("peso","altura")] # peso y altura de todas las personas
##           peso altura
## José        65    174
## Alan        70    180
## Francisco   68    170
  1. Dentro de las funciones que manejan las matrices podemos mencionar el apply() el cual consiste en los siguiente:
apply(X, MARGIN, FUN, ...)

donde:

  • X: es una matriz.
  • MARGIN: un vector que da los subíndices sobre los cuales la función será aplicada: 1 indica filas, 2 indica columnas, c (1,2) indica filas y columnas.
  • FUN: función a ser aplicada.
apply(datos, 2, mean)
##      edad      peso    altura 
##  20.33333  67.66667 174.66667
  1. lapply() es un caso especial de apply(), diseñado para aplicar funciones a todos los elementos de una lista. La l de su nombre se refiere, precisamente, a lista.
películas <- c ("SPYDERMAN", "BATMAN", "VERTIGO", "CHINATOWN")
movies_lower <-lapply (películas, tolower) # tolower convierte de mayúscula a minúscula
movies_lower
## [[1]]
## [1] "spyderman"
## 
## [[2]]
## [1] "batman"
## 
## [[3]]
## [1] "vertigo"
## 
## [[4]]
## [1] "chinatown"
  1. La función sapply en R aplica una función a un vector o lista y devuelve un vector.
sapply(1:4, sqrt)
## [1] 1.000000 1.414214 1.732051 2.000000

10.4 Arrays

Un array es la generalización de una matriz de dos dimensiones al caso multidimensional. Su definición general es de la forma:

array(datos, dimensiones) 
# dimensiones: c(filas,columnas,matrices)

Los comandos para manejar arrays son similares a los que manejan matrices. Por ejemplo:

array(1:12,c(2,3,2))
## , , 1
## 
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6
## 
## , , 2
## 
##      [,1] [,2] [,3]
## [1,]    7    9   11
## [2,]    8   10   12

Vamos a crear un array con la edad media, el peso medio y la estatura media para hombres y mujeres de dos poblaciones: San Salvador y La Libertad:

x<-array(c(45,46,65,55,170,167,48,49,68,56,169,165),c(2,3,2))
dimnames(x)<-list(c("hombres","mujeres"),c("edad","peso","altura"),
c("San Salvador","La Libertad"))
x
## , , San Salvador
## 
##         edad peso altura
## hombres   45   65    170
## mujeres   46   55    167
## 
## , , La Libertad
## 
##         edad peso altura
## hombres   48   68    169
## mujeres   49   56    165

Para acceder a los elementos del array:

  1. Nombre de las dimensiones del array
dimnames(x)
## [[1]]
## [1] "hombres" "mujeres"
## 
## [[2]]
## [1] "edad"   "peso"   "altura"
## 
## [[3]]
## [1] "San Salvador" "La Libertad"
  1. Datos para la población “La Libertad”
x[,,"La Libertad"] 
##         edad peso altura
## hombres   48   68    169
## mujeres   49   56    165
  1. Datos de todos los hombres
x["hombres",,]
##        San Salvador La Libertad
## edad             45          48
## peso             65          68
## altura          170         169
  1. Edades de las personas
x[,"edad",]
##         San Salvador La Libertad
## hombres           45          48
## mujeres           46          49
  1. Peso de las personas
x[,"peso",]
##         San Salvador La Libertad
## hombres           65          68
## mujeres           55          56

10.5 Listas

Las listas sirven para concatenar objetos donde cada uno puede tener una estructura distinta. Esto no ocurre, por ejemplo, en los arrays, donde todos los elementos deben ser del mismo tipo (todos números, o todos carácter digamos).

Una lista tiene una serie de componentes, a los que deberemos asignar un nombre.

Para crear una lista podemos hacer algo como lo siguiente:

mi.lista <- list(hombre = "Pedro", mujer = "María", casados = TRUE, numero.hijos = 4, edad.hijos = c(4, 7, 9, 2), nombre.hijos=c("Alfonso", "Pedro", "Luis", "María"))
mi.lista
## $hombre
## [1] "Pedro"
## 
## $mujer
## [1] "María"
## 
## $casados
## [1] TRUE
## 
## $numero.hijos
## [1] 4
## 
## $edad.hijos
## [1] 4 7 9 2
## 
## $nombre.hijos
## [1] "Alfonso" "Pedro"   "Luis"    "María"
  1. Acceesando datos a través de corchetes []
mi.lista[c("hombre", "numero.hijos")]
## $hombre
## [1] "Pedro"
## 
## $numero.hijos
## [1] 4
  1. El vector 1 y 4
mi.lista[c(1,4)]
## $hombre
## [1] "Pedro"
## 
## $numero.hijos
## [1] 4
  1. No mostrar ni el 1 ni el 4
mi.lista[c(-1,-4)]
## $mujer
## [1] "María"
## 
## $casados
## [1] TRUE
## 
## $edad.hijos
## [1] 4 7 9 2
## 
## $nombre.hijos
## [1] "Alfonso" "Pedro"   "Luis"    "María"
  1. Para acceder a componentes concretos se usa el operador $ seguido del nombre de la componente de la lista, o bien el número de la componente entre corchetes dobles [[]]
mi.lista$nombre.hijos
## [1] "Alfonso" "Pedro"   "Luis"    "María"

o equivalentemente:

mi.lista[[6]]
## [1] "Alfonso" "Pedro"   "Luis"    "María"

10.6 Data frames

Un marco de datos es una tabla o una estructura bidimensional similar a una matriz en la que cada columna contiene valores de una variable y cada fila contiene un conjunto de valores de cada columna.

empleado <- data.frame(
   id = c (1:5), 
   nombre = c("Ricardo","Daniel","Michelle","Rolando","Gabriela"),
   salario = c(623.3,515.2,611.0,729.0,843.25))
empleado   
##   id   nombre salario
## 1  1  Ricardo  623.30
## 2  2   Daniel  515.20
## 3  3 Michelle  611.00
## 4  4  Rolando  729.00
## 5  5 Gabriela  843.25