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.
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:
Pasos para instalar R:
Se da click en download R, despues de eso aparece una lista de todos los servidores de los cuales se puede descargar R.
Luego Install R for first time.
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
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.
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")
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.
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.
R contiene datasets que pueden ser utilizados directamente. Para dar un vistazo a los paquetes
paquetes <- library(help = "datasets")
head(paquetes$info[[2]])
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.
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')
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")
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().
R puede leer datos directamente de spss:
En algún momento tendremos que leer datos en la forma .xls o .xlsx. Existen distintos paquetes que permiten realizar la tarea, por ejemplo:
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”)
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:
>_
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
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.
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.
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")
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")
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()
rm(Nombre del objeto)
rm(list = ls())
q()
demo(graphics)
help(X)
print()
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 |
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.
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.
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.
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.
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.
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 |
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"
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 |
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 |
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:
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 |
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 | <- |
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 |
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
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
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"
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
Para simplificar la escritura de vectores existen varias órdenes con las cuales se crean de un modo automático:
Ejemplo
Crear la secuencia de 1 a 5
1:5
## [1] 1 2 3 4 5
Ejemplo
seq(1,6)
## [1] 1 2 3 4 5 6
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
Ejemplo
rep(1,5)
## [1] 1 1 1 1 1
rep(c(1,2),5)
## [1] 1 2 1 2 1 2 1 2 1 2
rep(1:4,2)
## [1] 1 2 3 4 1 2 3 4
Hay cuatro maneras de seleccionar elementos de un vector, y son:
Ejemplo
La orden extrae los elementos 1, 3 y 6 del vector edad.
edad[c(1,3,6)]
## a c f
## 45 30 42
edad[-3]
## a b d e f g h i j
## 45 25 34 28 42 24 38 40 35
edad[-c(1,2)]
## c d e f g h i j
## 30 34 28 42 24 38 40 35
edad > 30
## a b c d e f g h i j
## TRUE FALSE FALSE TRUE FALSE TRUE FALSE TRUE TRUE TRUE
edad[edad>30]
## a d f h i j
## 45 34 42 38 40 35
municipio[1]
## [1] "San Salvador"
municipio[5:6]
## [1] "San Miguel" "La Libertad"
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.
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"
sudamerica=factor(paises)
sudamerica
## [1] Argentina Perú Brasil Argentina Brasil Ecuador Ecuador
## [8] Colombia
## Levels: Argentina Brasil Colombia Ecuador Perú
class(sudamerica)
## [1] "factor"
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"
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"
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
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
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:
matrix(1:8)
## [,1]
## [1,] 1
## [2,] 2
## [3,] 3
## [4,] 4
## [5,] 5
## [6,] 6
## [7,] 7
## [8,] 8
matrix(1:8,nrow=4)
## [,1] [,2]
## [1,] 1 5
## [2,] 2 6
## [3,] 3 7
## [4,] 4 8
matrix(1:8,nrow=4,byrow=T)
## [,1] [,2]
## [1,] 1 2
## [2,] 3 4
## [3,] 5 6
## [4,] 7 8
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
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
apply(X, MARGIN, FUN, ...)
donde:
apply(datos, 2, mean)
## edad peso altura
## 20.33333 67.66667 174.66667
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"
sapply(1:4, sqrt)
## [1] 1.000000 1.414214 1.732051 2.000000
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:
dimnames(x)
## [[1]]
## [1] "hombres" "mujeres"
##
## [[2]]
## [1] "edad" "peso" "altura"
##
## [[3]]
## [1] "San Salvador" "La Libertad"
x[,,"La Libertad"]
## edad peso altura
## hombres 48 68 169
## mujeres 49 56 165
x["hombres",,]
## San Salvador La Libertad
## edad 45 48
## peso 65 68
## altura 170 169
x[,"edad",]
## San Salvador La Libertad
## hombres 45 48
## mujeres 46 49
x[,"peso",]
## San Salvador La Libertad
## hombres 65 68
## mujeres 55 56
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"
mi.lista[c("hombre", "numero.hijos")]
## $hombre
## [1] "Pedro"
##
## $numero.hijos
## [1] 4
mi.lista[c(1,4)]
## $hombre
## [1] "Pedro"
##
## $numero.hijos
## [1] 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"
mi.lista$nombre.hijos
## [1] "Alfonso" "Pedro" "Luis" "María"
o equivalentemente:
mi.lista[[6]]
## [1] "Alfonso" "Pedro" "Luis" "María"
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