¿Que es R?
R, también conocido como GNU S, representa un entorno integral y un lenguaje diseñado específicamente para el cálculo estadístico y la creación de gráficos (R Core Team, 2022). Este sistema se basa en un dialecto del elogiado lenguaje S, originario de los Laboratorios Bell y desarrollado por (“Programming with Data,” 1998).
Para aquellos menos familiarizados con este entorno, es importante destacar que R proporciona un acceso relativamente sencillo a una amplia gama de técnicas estadísticas y herramientas gráficas. Además, para usuarios con conocimientos avanzados, R brinda un lenguaje de programación completo que permite la incorporación de nuevas técnicas mediante la definición de funciones personalizadas.
Resulta fundamental señalar que S ha dejado una marca perdurable al transformar la manera en que las personas abordan el análisis, la visualización y la manipulación de datos, siendo reconocido con el premio Association of Computer Machinery Software System en 1998, otorgado a John Chambers.
En la actualidad, S y R se posicionan como los dos lenguajes más destacados y ampliamente utilizados en la investigación en estadística.
¿Que es Rstudio?
RStudio se presenta como un programa que proporciona una interfaz más amigable para interactuar con R, simplificando numerosas tareas de programación y análisis de datos en este entorno. En esencia, RStudio se clasifica como una Interfaz Gráfica de Usuario (GUI).
Desde una perspectiva más técnica, es esencial destacar que RStudio va más allá de ser simplemente una GUI; se configura como un Entorno de Desarrollo Integrado para R, denominado IDE por sus siglas en inglés (‘integrated development environment’).
Hadley Wickham, actual científico jefe de RStudio, se destaca como una figura prominente en el ámbito. Puedes obtener más información sobre él en su sitio web personal: Hadley Wickham, reconocido como uno de los desarrolladores más prolíficos de paquetes para R, ha sido el creador de un innovador enfoque de programación y análisis de datos en R conocido como tidyverse. Este enfoque ha dejado una marca significativa en la forma en que se aborda y realiza el análisis de datos en R.
Para instalar R en nuestro ordenador, vamos a la página web (https://cran.r-project.org/). Para descargar R, hacemos clic en Download del sistema operativo de nuestro ordenador, seleccionamos la opción adecuada.
Al hacer clic sobre Download R for Windows iremos a la página que se reproduce más abajo. Hacemos clic sobre install R for the first time
Por ultimo descargaremos la versión mas actualizada Download R-x.x.x for xxxx
RTools es un conjunto de herramientas que se utiliza con el lenguaje de programación R para facilitar el desarrollo y la compilación de paquetes y programas en R que incluyen código C y C++. Estas herramientas son esenciales para construir paquetes R que contienen funciones escritas en estos lenguajes de programación de bajo nivel, el cual podemos descargarlo de la siguiente paguina web (https://cran.r-project.org/bin/windows/Rtools/)
Debemos seleccionar la misma versión de Rtools que instalamos en R, siempre seleccionando la ultima
Una vez que hemos instalado R, descargamos RStudio desde AQUÍ (https://www.rstudio.com/), Al hacer clic sobre Download
Luego seleccionamos el sistema operativo de nuestro ordenador
En general, trabajamos con la interfaz de RStudio antes que con la de R porque la primera es “más amigable”. Para iniciar RStudio, hacemos clic en el icono de RStudio: Al abrir RStudio deberíamos ver algo parecido a:
RStudio está (normalmente) dividido en 4 paneles: Script Consola Entorno e historia Panel misceláneo: para visualizar ficheros, gráficos, paquetes, etc. Por defecto, la consola se encuentra en el panel izquierdo. Primero aparece un texto informativo y después el prompt del sistema (“>”). ¿Vemos el cursorintermitente? Aquí es donde R espera que le demos instrucciones. Para ejecutar las instrucciones y obtener el resultado pulsamos Enter.
Trabajar en la Consola es muy limitado ya que en la Consola las instrucciones generalmente se escriben y ejecutan una por una. Lo habitual es trabajar con scripts o ficheros de instrucciones. Estos ficheros tienen la extensión.R . Para crear un script, seleccionamos File > New File > R Script
Ahora el panel del script se sitúa en la parte superior-izquierda de RStudio y la Consola en el panel inferior-izquierdo. Por defecto, el nombre del nuevo scriptes ” Untitled1”.
¿Qué son los paquetes en R? Un paquete son muchos archivos juntos en un mismo lugar, como funciones en R, código o datos. De esta forma, Los paquetes permiten hacer más cosas con R. Por lo general, los paquetes están guardados o alojados en repositorios en internet.
¿Qué son los repositorios? Los repositorios son lugares diseñados para guardar código de tal forma que puedan ser consultados por nosotros.
En el caso de R es común que escuches repositorios como CRAN, github o bioconductor (este último para paquetes relacionados a la bioinformatica)
En esta entrada vamos a utilizar CRAN por ser el repositorio oficial de R. Los paquetes de CRAN están probados para funcionar sin problemas en la mayoría de versiones de R. Así que no tendremos ningún problema
¿Cómo instalar paquetes en R? Para instalar paquetes, podemos utilizar la consola de R o la interfaz de RStudio.
Instalar paquetes en R con la consola de R La manera más rápida de instalar un paquete de CRAN, es utilizando el comando.
install.packages("nombre_del_paquete")
Esta función de R, va al repositorio, descarga e instala todo con una línea de código.
Ahora tener instalados los paquetes no significa que ya podamos utilizarlos, primero tenemos que cargarlos en nuestra sesión de R
¿Cómo cargar instalados paquetes en R? Para «activar» o utilizar nuestros paquetes podemos ejecutar el comando
library("nombre_del_paquete")
Para esta practica instala los siguientes paquetes
install.packages("DT")
install.packages("kableExtra")
install.packages("modeest")
install.packages("psych")
install.packages("readr")
install.packages("AER")
Para esta practica carga los siguientes paquetes
library("DT")
library("kableExtra")
library("modeest")
library("psych")
## Registered S3 method overwritten by 'psych':
## method from
## plot.residuals rmutil
library("readr")
En R existen varios tipos de objectos que permiten que el usuario pueda almacenar la información para realizar procedimientos estadísticos y gráficos. Los principales objetos en R son vectores, matrices, arreglos, marcos de datos y listas. A continuación se presentan las características de estos objetos y la forma para crearlos.
Las variables sirven para almacenar un valor que luego vamos a utilizar en algún procedimiento.
Para hacer la asignación de un valor a alguna variable se utiliza el
operador <-
entre el valor y el nombre de la variable. A
continuación un ejemplo sencillo.
x <- 5
2 * x + 3
## [1] 13
En el siguiente ejemplo se crea la variable pais
y se
almacena el nombre Colombia, luego se averigua el número de caracteres
de la variable pais
.
pais <- "Colombia"
nchar(pais)
## [1] 8
Los vectores vectores son arreglos ordenados en los cuales se puede
almacenar información de tipo numérico (variable cuantitativa),
alfanumérico (variable cualitativa) o lógico (TRUE
o
FALSE
), pero no mezclas de éstos. La función de R para
crear un vector es c()
y que significa concatenar; dentro
de los paréntesis de esta función se ubica la información a almacenar.
Una vez construído el vector se acostumbra a etiquetarlo con un nombre
corto y representativo de la información que almacena, la asignación se
hace por medio del operador <-
entre el nombre y el
vector.
A continuación se presenta un ejemplo de cómo crear tres vectores que contienen las respuestas de cinco personas a tres preguntas que se les realizaron.
edad <- c(15, 19, 13, NA, 20)
deporte <- c(TRUE, TRUE, NA, FALSE, TRUE)
comic_fav <- c(NA, 'Superman', 'Batman', NA, 'Batman')
El vector edad
es un vector cuantitativo y contiene las
edades de las 5 personas. En la cuarta posición del vector se colocó el
símbolo NA
que significa Not Available
debido a que no se registró la edad para esa persona. Al hacer una
asignación se acostumbra a dejar un espacio antes y después del operador
<-
de asignación. El segundo vector es llamado
deporte
y es un vector lógico que almacena las respuestas a
la pregunta de si la persona practica deporte, nuevamente aquí hay un
NA
para la tercera persona. El último vector
comic_fav
contiene la información del cómic favorito de
cada persona, como esta variable es cualitativa es necesario usar las
comillas ' '
para encerrar las respuestas.
Cuando se usa NA
para representar una información
Not Available no se deben usar comillas.
Es posible usar comillas sencillas 'foo'
o comillas
dobles "foo"
para ingresar valores de una variable
cualitativa.
Si se desea ver lo que está almacenado en cada uno de estos vectores, se debe escribir en la consola de R el nombre de uno de los objetos y luego se presiona la tecla enter o intro, al realizar esto lo que se obtiene se muestra a continuación.
edad
deporte
comic_fav
Una variable es un vector de longitud uno.
Para extraer un elemento almacenado dentro un vector se usan los
corchetes []
y dentro de ellos la posición o posiciones que
interesan.
Si queremos extraer la edad de la tercera persona escribimos el
nombre del vector y luego [3]
para indicar la tercera
posición de edad
, a continuación el código.
edad[3]
## [1] 13
Si queremos conocer el cómic favorito de la segunda y quinta persona,
escribimos el nombre del vector y luego, dentro de los corchetes,
escribimos otro vector con las posiciones 2 y 5 que nos interesan así
[c(2, 5)]
, a continuación el código.
comic_fav[c(2, 5)]
## [1] "Superman" "Batman"
Si nos interesan las respuestas de la práctica de deporte, excepto la
de la persona 3, usamos [-3]
luego del nombre del vector
para obtener todo, excepto la tercera posición.
deporte[-3]
## [1] TRUE TRUE FALSE TRUE
Si desea extraer varios posiciones de un vector NUNCA escriba esto:
mivector[2, 5, 7]
. Tiene que crear un vector con las
posiciones y luego colocarlo dentro de los corchetes así:
mivector[c(2, 5, 7)]
Las matrices son arreglos rectangulares de filas y columnas con
información numérica, alfanumérica o lógica. Para construir una matriz
se usa la función matrix( )
. Por ejemplo, para crear una
matriz de 4 filas y 5 columnas (de dimensión \(4 \times 5\)) con los primeros 20 números
positivos se escribe el código siguiente en la consola.
mimatriz <- matrix(data=1:20, nrow=4, ncol=5, byrow=FALSE)
El argumento data
de la función sirve para indicar los
datos que se van a almacenar en la matriz, los argumentos
nrow
y ncol
sirven para definir la dimensión
de la matriz y por último el argumento byrow
sirve para
indicar si la información contenida en data
se debe
ingresar por filas o no. Para observar lo que quedó almacenado en el
objeto mimatriz
se escribe en la consola el nombre del
objeto seguido de la tecla enter o
intro.
mimatriz
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 5 9 13 17
## [2,] 2 6 10 14 18
## [3,] 3 7 11 15 19
## [4,] 4 8 12 16 20
Al igual que en el caso de los vectores, para extraer elementos
almacenados dentro de una matriz se usan los corchetes
[ , ]
y dentro, separado por una coma, el número de fila(s)
y el número de columna(s) que nos interesan.
Si queremos extraer el valor almacenado en la fila 3 y columna 4 usamos el siguiente código.
mimatriz[3, 4]
## [1] 15
Si queremos recuperar toda la fila 2 usamos el siguiente código.
mimatriz[2, ] # No se escribe nada luego de la coma
## [1] 2 6 10 14 18
Si queremos recuperar toda la columna 5 usamos el siguiente código.
mimatriz[, 5] # No se escribe nada antes de la coma
## [1] 17 18 19 20
Si queremos recuperar la matriz original sin las columnas 2 y 4 usamos el siguiente código.
mimatriz[, -c(2, 4)] # Las columnas como vector
## [,1] [,2] [,3]
## [1,] 1 9 17
## [2,] 2 10 18
## [3,] 3 11 19
## [4,] 4 12 20
Si queremos recuperar la matriz original sin la fila 1 ni columna 3 usamos el siguiente código.
mimatriz[-1, -3] # Signo de menos para eliminar
## [,1] [,2] [,3] [,4]
## [1,] 2 6 14 18
## [2,] 3 7 15 19
## [3,] 4 8 16 20
Un arreglo es una matriz de varias dimensiones con información
numérica, alfanumérica o lógica. Para construir una arreglo se usa la
función array( )
. Por ejemplo, para crear un arreglo de
\(3 \times 4 \times 2\) con las
primeras 24 letras minúsculas del alfabeto se escribe el siguiente
código.
miarray <- array(data=letters[1:24], dim=c(3, 4, 2))
El argumento data
de la función sirve para indicar los
datos que se van a almacenar en el arreglo y el argumento
dim
sirve para indicar las dimensiones del arreglo. Para
observar lo que quedó almacenado en el objeto miarray
se
escribe en la consola lo siguiente.
miarray
## , , 1
##
## [,1] [,2] [,3] [,4]
## [1,] "a" "d" "g" "j"
## [2,] "b" "e" "h" "k"
## [3,] "c" "f" "i" "l"
##
## , , 2
##
## [,1] [,2] [,3] [,4]
## [1,] "m" "p" "s" "v"
## [2,] "n" "q" "t" "w"
## [3,] "o" "r" "u" "x"
Para recuperar elementos almacenados en un arreglo se usan también corchetes, y dentro de los corchetes, las coordenadas del objeto de interés.
Si queremos extraer la letra almacenada en la fila 1 y columna 3 de
la segunda capa de miarray
usamos el siguiente código.
miarray[1, 3, 2] # El orden es importante
## [1] "s"
Si queremos extraer la segunda capa completa usamos el siguiente código.
miarray[,, 2] # No se coloca nada en las primeras posiciones
## [,1] [,2] [,3] [,4]
## [1,] "m" "p" "s" "v"
## [2,] "n" "q" "t" "w"
## [3,] "o" "r" "u" "x"
Si queremos extraer la tercera columna de todas las capas usamos el siguiente código.
miarray[, 3,] # No se coloca nada en las primeras posiciones
## [,1] [,2]
## [1,] "g" "s"
## [2,] "h" "t"
## [3,] "i" "u"
El marco de datos marco de datos o data frame es uno de los
objetos más utilizados porque permite agrupar vectores con información
de diferente tipo (numérica, alfanumérica o lógica) en un mismo objeto,
la única restricción es que los vectores deben tener la misma longitud.
Para crear un marco de datos se usa la función
data.frame( )
, como ejemplo vamos a crear un marco de datos
con los vectores edad
, deporte
y
comic_fav
definidos anteriormente.
mimarco <- data.frame(edad, deporte, comic_fav)
Una vez creado el objeto mimarco
podemos ver el objeto
escribiendo su nombre en la consola, a continuación se muestra lo que se
obtiene.
mimarco
## edad deporte comic_fav
## 1 15 TRUE <NA>
## 2 19 TRUE Superman
## 3 13 NA Batman
## 4 NA FALSE <NA>
## 5 20 TRUE Batman
De la salida anterior vemos que el marco de datos tiene 3 variables (columnas) cuyos nombres coinciden con los nombres de los vectores creados anteriormente, los números consecutivos al lado izquierdo son sólo de referencia y permiten identificar la información para cada persona en la base de datos.
Para recuperar las variables (columnas) almacenadas en un marco de
datos se puede usar el operador $
, corchetes simples
[]
o corchetes dobles [[]]
. A continuación
algunos ejemplos para entender las diferencias entre estas opciones.
Si queremos extraer la variable deporte
del marco de
datos mimarco
como un vector usamos el siguiente
código.
mimarco$deporte # Se recomienda si el nombre es corto
## [1] TRUE TRUE NA FALSE TRUE
Otra forma de recuperar la variable deporte
como vector
es indicando el número de la columna donde se encuentra la variable.
mimarco[, 2] # Se recomienda si recordamos su ubicación
## [1] TRUE TRUE NA FALSE TRUE
Otra forma de extraer la variable deporte
como vector es
usando [[]]
y dentro el nombre de la variable.
mimarco[["deporte"]]
## [1] TRUE TRUE NA FALSE TRUE
Si usamos mimarco["deporte"]
el resultado es la variable
deporte
pero en forma de marco de datos, no en forma
vectorial.
mimarco["deporte"]
## deporte
## 1 TRUE
## 2 TRUE
## 3 NA
## 4 FALSE
## 5 TRUE
Si queremos extraer un marco de datos sólo con las variables deporte y edad podemos usar el siguiente código.
mimarco[c("deporte", "edad")]
## deporte edad
## 1 TRUE 15
## 2 TRUE 19
## 3 NA 13
## 4 FALSE NA
## 5 TRUE 20
Por otra, si queremos la edad
de las personas que están
en las posiciones 2 hasta 4 usamos el siguiente código.
mimarco[2:4, 1]
## [1] 19 13 NA
Para extraer partes de un marco de datos se puede utilizar la función
subset(x, subset, select)
. El parámetro x
sirve para indicar el marco de datos original, el parámetro
subset
sirve para colocar la condición y el parámetro
select
sirve para quedarnos sólo con algunas de las
variables del marco de datos. A continuación varios ejemplos de la
función subset
para ver su utilidad.
Si queremos el marco de datos mimarco
sólo con las
personas que SI practican deporte usamos el siguiente código.
subset(mimarco, subset=deporte == TRUE)
## edad deporte comic_fav
## 1 15 TRUE <NA>
## 2 19 TRUE Superman
## 5 20 TRUE Batman
Si queremos el marco de datos mimarco
sólo con las
personas mayores o iguales a 17 años usamos el siguiente código.
subset(mimarco, subset=edad >= 17)
## edad deporte comic_fav
## 2 19 TRUE Superman
## 5 20 TRUE Batman
Si queremos el submarco con deporte y comic de las personas menores de 20 años usamos el siguiente código.
subset(mimarco, subset=edad < 20, select=c('deporte', 'comic_fav'))
## deporte comic_fav
## 1 TRUE <NA>
## 2 TRUE Superman
## 3 NA Batman
Si queremos el marco de datos mimarco
sólo con las
personas menores de 20 años y que SI practican deporte usamos el
siguiente código.
subset(mimarco, subset=edad < 20 & deporte == TRUE)
## edad deporte comic_fav
## 1 15 TRUE <NA>
## 2 19 TRUE Superman
Leer la base de datos medidas del cuerpo disponible en este enlace https://raw.githubusercontent.com/fhernanb/datos/master/medidas_cuerpo. Extraer de esta base de datos una sub-base o subconjunto que contenga sólo la edad, peso, altura y sexo de aquellos que miden más de 185 cm y pesan más de 80 kg.
url <- 'https://raw.githubusercontent.com/fhernanb/datos/master/medidas_cuerpo'
dt1 <- read.table(url, header=T)
dim(dt1) # Para conocer la dimensión de la base original
## [1] 36 6
dt2 <- subset(x=dt1, subset=altura > 185 & peso > 80,
select=c('sexo', 'edad', 'peso', 'altura'))
dt2 # Para mostrar la base de datos final
## sexo edad peso altura
## 1 Hombre 43 87.3 188.0
## 6 Hombre 33 85.9 188.0
## 15 Hombre 30 98.2 190.5
Al almacenar la nueva base de datos en el objeto dt2
se
puede manipular este nuevo objeto para realizar los análisis de
interés.
Las listas son otro tipo de objeto muy usado para almacenar objetos
de diferente tipo. La instrucción para crear una lista es
list( )
. A continuación vamos a crear una lista que
contiene tres objetos: un vector con 5 números aleatorios llamado
mivector
, una matriz de dimensión \(6 \times 2\) con los primeros doce números
enteros positivos llamada matriz2
y el tercer objeto será
el marco de datos mimarco
creado en el apartado anterior.
Las instrucciones para crear la lista requerida se muestran a
continuación.
set.seed(12345)
mivector <- runif(n=5)
matriz2 <- matrix(data=1:12, ncol=6)
milista <- list(E1=mivector, E2=matriz2, E3=mimarco)
La función set.seed
de la línea número 1 sirve para
fijar la semilla de tal manera que los números aleatorios generados en
la segunda línea con la función runif
sean siempre los
mismos. En la última línea del código anterior se construye la lista,
dentro de la función list
se colocan los tres objetos
mivector
, matriz2
y mimarco
. Es
posible colocarle un nombre especial a cada uno de los elementos de la
lista, en este ejemplo se colocaron los nombres E1
,
E2
y E3
para cada uno de los tres elementos.
Para observar lo que quedó almacenado en la lista se escribe
milista
en la consola y el resultado se muestra a
continuación.
milista
## $E1
## [1] 0.7209039 0.8757732 0.7609823 0.8861246 0.4564810
##
## $E2
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 3 5 7 9 11
## [2,] 2 4 6 8 10 12
##
## $E3
## edad deporte comic_fav
## 1 15 TRUE <NA>
## 2 19 TRUE Superman
## 3 13 NA Batman
## 4 NA FALSE <NA>
## 5 20 TRUE Batman
Para recuperar los elementos almacenadas en una lista se usa el
operador $
, corchetes dobles [[]]
o corchetes
sencillos []
. A continuación unos ejemplos para entender
cómo extraer elementos de una lista.
Si queremos la matriz almacenada con el nombre de E2
dentro del objeto milista
se puede usar el siguiente
código.
milista$E2
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 3 5 7 9 11
## [2,] 2 4 6 8 10 12
Es posible indicar la posición del objeto en lugar del nombre, para eso se usan los corchetes dobles.
milista[[2]]
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 3 5 7 9 11
## [2,] 2 4 6 8 10 12
El resultado obtenido con milista$E2
y
milista[[2]]
es exactamente el mismo.
Vamos ahora a solicitar la posición 2 pero usando corchetes
sencillos.
milista[2]
## $E2
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 3 5 7 9 11
## [2,] 2 4 6 8 10 12
La apariencia de este último resultado es similar, no igual, al
encontrado al usar $
y [[]]
. Para ver la
diferencia vamos a pedir la clase a la que pertenecen los tres últimos
objetos usando la función class
. A continuación el código
usado.
class(milista$E2)
## [1] "matrix" "array"
class(milista[[2]])
## [1] "matrix" "array"
class(milista[2])
## [1] "list"
De lo anterior se observa claramente que cuando usamos $
o [[]]
el resultado es el objeto almacenado, una matriz.
Cuando usamos []
el resultado es una lista
cuyo contenido es el objeto almacendado.
Al manipular listas con $
y [[]]
se
obtienen los objetos ahí almacenados, al manipular listas con
[]
se obtiene una lista.
Use funciones o procedimientos (varias líneas) de R para responder cada una de las siguientes preguntas.
Construya un vector con la primeras 20 letras MAYÚSCULAS usando la función LETTERS.
Construya una matriz de \(10 \times 10\) con los primeros 100 números positivos pares.
Construya una matriz identidad de dimension \(3 \times 3\). Recuerde que una matriz identidad tiene sólo unos en la diagonal principal y los demás elementos son cero.
Construya una lista con los anteriores tres objetos creados.
Construya un marco de datos o data frame con las respuestas de 3 personas a las preguntas: (a) ¿Cuál es su edad en años? (b) ¿Tipo de música que más le gusta? (c) ¿Tiene usted pareja sentimental estable?
¿Cuál es el error al correr el siguiente código? ¿A qué se debe?
edad <- c(15, 19, 13, NA, 20)
deporte <- c(TRUE, TRUE, NA, FALSE, TRUE)
comic_fav <- c(NA, 'Superman', 'Batman', NA, 'Batman')
matrix(edad, deporte, comic_fav)
Usando R como una calculadora
1 + 100
## [1] 101
R te mostrará la respuesta, precedido de un “[1]”. No te preocupes por esto por ahora, lo explicaremos más adelante. Por ahora piensa en eso como parte de la salida.
Al igual que bash, si escribes un comando incompleto R esperará a que lo completes:
“1 +”
Si usas R desde la línea de comandos en lugar de estar dentro de RStudio, debes usar Ctrl + C en lugar de Esc para cancelar el comando. ¡Esto se aplica también a los usuarios de Mac!
La cancelación de un comando no sólo es útil para matar comandos incompletos: también puedes usarlo para decirle a R que deje de ejecutar el código (por ejemplo, si tarda mucho más de lo que esperabas), o para deshacerte del código que estás escribiendo actualmente.
Los operadores aritméticos de R nos permiten realizar operaciones matemáticas, como sumas, divisiones o multiplicaciones, entre otras. La siguiente tabla resume todos los operadores aritméticos de R base.
# Operaciones básicas
3 + 5
## [1] 8
8 - 3
## [1] 5
7 * 5
## [1] 35
1/2
## [1] 0.5
4 ^ 4
## [1] 256
4 ** 4
## [1] 256
5 %% 3
## [1] 2
5 %/% 3
## [1] 1
Los operadores de comparación o relacionales están diseñados para comparar objetos. El resultado de estas comparaciones son de tipo booleano. La siguiente tabla resume los operadores relacionales de R.
Puedes comparar valores enteros con estos operadores de la siguiente manera.
# Operaciones básicas
3 > 5
## [1] FALSE
3 < 5
## [1] TRUE
3 >= 5
## [1] FALSE
3 <= 5
## [1] TRUE
3 == 5
## [1] FALSE
3 != 5
## [1] TRUE
Los operadores booleanos o lógicos en R se utilizan para especificar múltiples condiciones entre objetos. Estas comparaciones devuelven valores TRUE o FALSE.
# Operaciones básicas
40 & 5 > 30
## [1] FALSE
40 | 5 > 30
## [1] TRUE
# Vectores
x <- c(3, 4, 5)
y <- c(3, 5, 1)
x & y
## [1] TRUE TRUE TRUE
x | y
## [1] TRUE TRUE TRUE
!x
## [1] FALSE FALSE FALSE
Existen funciones básicas muy utilizadas en matemáticas son: sin, cos, tan, asin, acos, atan, atan2, log, logb, log10, exp, sqrt, abs. A continuación algunos ejemplos de las anteriores funciones.
# Ejemplos de medidas trigonométricas
angulos <- c(0, pi/2, pi)
sin(angulos)
## [1] 0.000000e+00 1.000000e+00 1.224606e-16
tan(angulos)
## [1] 0.000000e+00 1.633124e+16 -1.224647e-16
# Ejemplos de logaritmos
log(100)
## [1] 4.60517
logb(125, base=5)
## [1] 3
# Ejemplos de exponencial
exp(1)
## [1] 2.718282
exp(2)
## [1] 7.389056
exp(1:3)
## [1] 2.718282 7.389056 20.085537
# Ejemplos de raices
sqrt(49) # Raiz cuadrada de 49
## [1] 7
27 ^ (1/3) # Raiz cúbica de 273
## [1] 3
#Ejemplos de valor absoluto
abs(2.5)
## [1] 2.5
abs(-3.6)
## [1] 3.6
Las funciones que aquí vamos a mostrar, se aplican generalmente a los valores de una matriz o vector de manera que nos devolverán los valores de estos:
Nota : Las Medidas de tendencia central Representan un valor alrededor del cual tienden a concentrarse las observaciones. Las más utilizadas son la media aritmética o promedio, la mediana y la moda.
Nota : Las medidas de posición Son valores que indican la ubicación de los datos en relación con el resto de las observaciones ordenadas, y resultan muy útiles para identificar el comportamiento de un conjunto de datos. Las medidas de posición se llaman generalmente cuantiles, y se pueden clasificar en tres grupos: cuartiles, deciles y percentile
Nota : las medidas de dispersión Permiten cuantificar la variabilidad de una característica de interés. La variación puede definirse, como la diferencia que existe entre las unidades de estudio respecto a la variable analizada (Isaza, 2012). Entre las medidas de dispersión se encuentran: el rango, el rango intercuartil, la varianza, la desviación estándar y el coeficiente de variación.
x: variable cuantitativa sobre la que se va a realizar el cálculo.
na.rm: indica si se deben excluir los datosfaltantes (valores NA), en caso de que la variable de interés los tenga. Por defecto: na.rm = FALSE
x<- c(18,19,20,18,24,17,22,15,22,25) # Vector
min <- min(x, na.rm = TRUE) # Mínimo
q1 <- quantile(x, probs = 0.25, na.rm = TRUE) # Quantil Q1
media <- mean.default(x, na.rm = TRUE) # Media
media_rec <- mean.default(x, trim = 0.025, na.rm = TRUE) # Media recortada
mediana <- median.default(x, na.rm = TRUE) # Mediana
moda <- mode(x) # Moda
var <- var(x, na.rm = TRUE) # Varianza
desvest <- sd(x, na.rm = TRUE) # Desviación Estándar
q3 <- quantile(x, probs = 0.75, na.rm = TRUE) # Quantil Q3
max <- max(x, na.rm = TRUE) # Maximo
s <- skew(x) # Simetría
c <- kurtosi(x) # Curtosis
Est_descriptivos<- as.numeric(c(min, q1, media, media_rec, mediana, moda,
var, desvest, q3, max, s, c))
nombres <- c("Mínimo", "Q1", "Media", "Media recortada", "Mediana", "Moda",
"Varianza", "Desviación Estándar", "Q3", "Máximo", "Simetría",
"Curtosis")
Est_descriptivos<-data.frame("Estadística" = nombres,
Valor =round(Est_descriptivos,2) )
kableExtra::kable(Est_descriptivos)
summary(x) # resumen de las variables
Puedes crear funciones para encapsular un conjunto de instrucciones que realizan una tarea específica. Las funciones te permiten reutilizar código, mejorar la legibilidad y modularizar tu programa. Una función en R consta de los siguientes elementos:
Nombre de la función: Debes elegir un nombre descriptivo para tu función, que sea único dentro de tu entorno de trabajo.
Argumentos: Los argumentos son los valores que se pasan a la función para que los procese. Pueden ser obligatorios u opcionales, y puedes definir valores predeterminados para los opcionales.
Cuerpo de la función: Es el conjunto de instrucciones que la función ejecuta cuando se llama. Puede incluir operaciones aritméticas, llamadas a otras funciones, bucles, etc.
Valor de retorno: Es el resultado que devuelve la función después de ejecutar las instrucciones en su cuerpo. Puede ser cualquier objeto de R, como un vector, una matriz, un marco de datos, etc.
# Definir la función
sumar <- function(a, b) {
resultado <- a + b # Suma los dos números
return(resultado) # Devuelve el resultado
}
# Llamar a la función y almacenar el resultado en una variable
resultado_suma <- sumar(5, 3)
# Imprimir el resultado
print(resultado_suma)
## [1] 8
Crear dos conjuntos de datos, de nombre RegA y RegB que contengan la información recogida en las tablas anteriores
Calculo los estadisticos descriptivos para las variables diam, alt y vol
diam<- c(8.3, 8.6, 8.8, 10.5, 10.5, 10.8, 11, 11, 11.1, 11.2, 11.3, 11.4, 11.4, 11.7, 12, 12.9, 12.9) alt<- c(70, 65, 63, 72, 81, 83, 66, 75, 80, 75, 79, 76, 76, 69, 75, 74, 85) vol<- c(10.3, 10.3, 10.2, 16.4, 18.8, 19.7, 15.6, NA, 22.6, 19.9, 24.2, 21, 21.4, 21.3, 19.1, 22.2, 33.8) var<- c(“B”, “A”, “R”, “R”, “R”, “R”, “B”, “A”, “R”, “B”, “A”, “B”, “R”, “R”, “A”, “A”, “B”)
R puede importar datos de una amplia variedad de tipos de archivo con las funciones en base además de que esta capacidad es ampliada con el uso de paquetes específicos.
Cuando importamos un archivo, estamos guardando su contenido en nuestra sesión como un objeto. Dependiendo del procedimiento que usemos será el tipo de objeto creado.
De manera análoga, podemos exportar nuestros objetos de R a archivos en nuestra computadora.
Tipos de datos que veremos
Introduciremos funciones para importar/exportar datos de los siguientes formatos: * Datos en formato texto (o tabulares)
Formatos de otros programas (software propietario)
Formatos propios de R
Para leer archivos de tu PC poniendo la ruta del archivo, cambiando
\
por /
, los archivos tienes que
proporcionarle a R la ruta del archivo con el nombre. Lo puedes hacer tú
poniendo toda la ruta con el nombre y la extensión. Tipo:
Nota: Los argumentos de la función read.table son:
file: nombre o ruta donde están alojados los datos. Puede ser un url o una dirección del computador. Es también posible usar file.choose() para que se abra un ventana y adjuntar el archivo deseado manualmente.
header: valor lógico, se usa TRUE si la primera línea de la base de datos tiene los nombres de las variables, caso contrario se usa FALSE.
sep: tipo de separación interna para los datos dentro del archivo. Los valores usuales para este parámetros son:
sep = ‘,’ si el archivo tiene extensión .csv.
sep = ’’ si el archivo es bloc de notas con espacios por la barra espaciadora.
sep = ’ si el archivo es bloc de notas con espacios por la barra tabuladora.
tusDatos <- read_csv(file="la_ruta_del_archivo", header = TRUE) # Lectura de datos .csv
tusDatos <- read.table(file="la_ruta_del_archivo", header =TRUE, sep =';') # Lectura de datos .txt
library("readxl") # Lectura de datos .xlsx o .xlx
tusDatos <- read_excel(file="la_ruta_del_archivo", sheet = "el nombre de la Hoja que quieres leer")
# Puedes leer la hoja número 1. La primera de todas
misDatos <- read_excel(file="la_ruta_del_archivo", sheet = 1)
Para leer archivos desde internet, se debe poner la ruta (URL) de la web donde hay datos.
tusDatos <- read.csv("http://www.sthda.com/upload/boxplot_format.txt", sep="\t")
Crear un documento R Markdown, realizando las siguientes actividades: Descargar datasets de R, crear archivos de excel (o, en otros formatos)
R cuenta con un sistema de generación de gráficas poderoso y flexible. Si nembargo, tener estar cualidades hace que este sistema sea un tanto complejo para aprender.
Para realizar los gráficos de este tutorial vamos a utilizar datos que se encuentran accesibles en el paquete AER . Por tanto, cargamos la librería AER (si no la tenemos hay que instalar el paquete).
El paquete AER contiene más de 100 bases de datos ( data sets ). ¿Recordamos cómo podemos obtener el listado de datos que contiene un paquete?
Así pues, tenemos un total de 554 observaciones y las siguientes 11 variables:
Un histograma es una gráfica que nos permite observar la distribución de datos numéricos usando barras. Cada barra representa el número de veces (frecuencia) que se observaron datos en un rango determinado.
ggplot(datos, aes(x = wage)) +
geom_histogram(bins = 20, fill = "skyblue", color = "black") +
labs(
title = "Distribución del Salario (dólares por hora)",
x = "Salario",
y = "Número de personas"
)
Este es quizás el tipo de gráfico mejor conocido de todos. Una gráfica de este tipo nos muestra la frecuencia con la que se han observado los datos de una variable discreta, con una barra para cada categoría de esta variable.
frecuencias <- table(datos$occupation) # con variable categórica
# Convertir las frecuencias a un dataframe
df_frecuencias <- data.frame(occupation = names(frecuencias),
frecuencia = as.numeric(frecuencias))
# Crear el gráfico de barras con ggplot2
ggplot(df_frecuencias, aes(x = occupation, y = frecuencia, fill = occupation)) +
geom_bar(stat = "identity") +
geom_text(aes(label = frecuencia), position = position_stack(vjust = 0.5), size = 3) +
labs(title = "Frecuencia de Ocupaciones", x = "Ocupación", y = "Frecuencia") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
los gráficos Boxplot (o Box and Whiskers, más conocidos como Caja y Bigotes) se representan los cinco números (mínimo, cuartil 1, mediana, cuartil 3 y máximo), lo que nos puede ayudar a hacernos una idea de la asimetría de la distribución. Los gráficos de Caja y Bigotes también permiten detectar valores atípicos y outliers.
Boxplot según el salario entre Hombre (Male) y Mujeres (Famale)
ggplot(datos, aes(x = gender, y = wage, fill = gender)) +
geom_boxplot(outlier.colour = "orange", outlier.shape = 16, outlier.size = 2) +
labs(title = "Salario (dólares por hora) según género", y = "Salario") +
scale_x_discrete(labels = c("Hombres", "Mujeres")) +
scale_fill_manual(values = rainbow(2)) +
coord_cartesian(ylim = c(0, max(datos$wage))) +
theme_minimal()
Boxplot según su trabajo entre Hombre (Male) y Mujeres (Famale)
ggplot(datos, aes(x = gender, y = wage, fill = gender)) +
geom_boxplot() +
labs(title = "Salario (dólares por hora) según género", y = "Salario") +
scale_x_discrete(labels = c("Hombres", "Mujeres")) +
scale_fill_manual(values = rainbow(2)) +
facet_wrap(~ occupation, scales = "free", nrow = 2) +
coord_cartesian(ylim = c(0, max(datos$wage))) +
theme_minimal()
Boxplot horizontal con variables categóricas invertidas
ggplot(datos, aes(x = wage, y = gender, fill = gender)) +
geom_boxplot() +
labs(title = "Salario (dólares por hora) según género (Boxplot horizontal)", x = "Salario")+
scale_y_discrete(labels = c("Hombres", "Mujeres")) +
scale_fill_manual(values = rainbow(2)) +
coord_cartesian(xlim = c(0, max(datos$wage)))+
theme_minimal()
Los diagramas de dispersión permiten realizar un diagnóstico visual de la posible relación (funcional) entre dos variables de naturaleza cuantitativa. La función que permite realizar este tipo de gráfico es plot() .
ggplot(datos, aes(x = experience, y = log(wage))) +
geom_point() +
labs(title = "Salario (en logaritmos) en función de la experiencia",
x = "Experiencia (en años)",
y = "Salario (en logaritmos)") +
theme_minimal()
Un gráfico de sectores, también conocido como gráfico circular, gráfico de pastel, de tarta, de torta o pie chart, por su nombre en inglés, es un gráfico circular que representa proporciones o porcentajes en sectores, donde el área y la longitud del arco de cada sector es proporcional a la cantidad representada. Existen variaciones de de este tipo de gráfico, como los gráficos de anillos, de donut, de waffles y gráficos spie. En este tutorial revisaremos cómo hacer un gráfico de sectores en R base.
# Crear un nuevo conjunto de datos con etiquetas de porcentaje
datos_porcentajes <- data.frame(ethnicity = names(prop.table(table(datos$ethnicity)) * 100), porcentaje = prop.table(table(datos$ethnicity)) * 100)
ggplot(datos_porcentajes, aes(x = "", y= porcentaje.Freq, fill = ethnicity)) +
geom_bar(width = 1, stat = "identity") +
coord_polar(theta = "y") +
labs(title = "Gráfico de sectores", fill = "Grupo étnico") +
scale_fill_manual(values = heat.colors(3), labels = c("Caucásicos", "Hispanos", "Otros")) +
geom_text(aes(label = paste0(round(porcentaje.Freq, 1), "%")),
position = position_stack(vjust = 0.5)) +
theme_void()
construlle un grafico de cada tipo de un base de dato de tu interes e interpreta su sultado
Los bucles y las sentencias se utilizan para controlar el flujo de ejecución de un programa. Aquí tienes una descripción de los bucles y las sentencias más comunes en RStudio.
Los condicionales en RStudio se utilizan para tomar decisiones en función del cumplimiento o no de una condición. Los condicionales más comunes son if, else if y else.
edad<-18
if(edad >=18){
cat("\n Es mayor de edad")
}
##
## Es mayor de edad
edad<-17
if(edad >=18){
cat("\n Es mayor de edad")
} else {
cat("\n Es menor de edad")
}
##
## Es menor de edad
3.else if: Permite evaluar otra condición si la primera no se cumple.
nota<-4.5
if(nota<3){
cat("\n Reprobado")
} else if(nota<4 ){
cat("\n Aprobado")
} else {
cat("\n Excelete")
}
##
## Excelete
los bucles son secuencias repetitivas hasta culminar el contador, de los cuales tenemos for y while
for (variable in secuencia) {
# Código a ejecutar
}
1.1. Bucle for con vectores numéricos
# Crear un vector numérico
numeros <- c(1, 2, 3, 4, 5)
# Iterar sobre cada elemento del vector e imprimirlo
for (num in numeros) {
print(num)
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
1.2. Bucle for con listas
# Crear una lista con diferentes tipos de datos
mi_lista <- list(nombre = "Juan", edad = 30, casado = TRUE)
# Iterar sobre cada elemento de la lista e imprimirlo
for (elemento in mi_lista) {
print(elemento)
}
## [1] "Juan"
## [1] 30
## [1] TRUE
1.3. Bucle for con matrices
# Crear una matriz 2x2
matriz <- matrix(1:4, nrow = 2)
# Iterar sobre cada elemento de la matriz e imprimirlo
for (fila in 1:nrow(matriz)) {
for (columna in 1:ncol(matriz)) {
print(matriz[fila, columna])
}
}
## [1] 1
## [1] 3
## [1] 2
## [1] 4
1.4. Bucle for con data frames
# Crear un data frame con información de estudiantes
estudiantes <- data.frame(nombre = c("María", "Pedro", "Luis"),
edad = c(25, 28, 30),
calificación = c(85, 90, 88))
# Iterar sobre cada fila del data frame e imprimir información
for (i in 1:nrow(estudiantes)) {
cat("Nombre:", estudiantes[i, "nombre"], "\n")
cat("Edad:", estudiantes[i, "edad"], "\n")
cat("Calificación:", estudiantes[i, "calificación"], "\n\n")
}
## Nombre: María
## Edad: 25
## Calificación: 85
##
## Nombre: Pedro
## Edad: 28
## Calificación: 90
##
## Nombre: Luis
## Edad: 30
## Calificación: 88
1.5. Bucle for condicionado
La instrucción break es una herramienta esencial en la programación para interrumpir la ejecución de un bucle y salir de él. Esta instrucción se emplea tanto en bucles iterativos como en bucles condicionales. Su función principal radica en detener la repetición del bloque de código del bucle en el momento en que se cumple una condición específica. Una vez que se alcanza esta condición, el flujo del programa se interrumpe y se sale del bucle, permitiendo que la ejecución continúe fuera de él. Esta capacidad de control de flujo es fundamental para optimizar el rendimiento y la lógica de los programas, ya que permite gestionar eficientemente el flujo de ejecución en función de condiciones específicas.
La instrucción next es una herramienta fundamental en la programación para controlar el flujo de ejecución dentro de un bucle. Se utiliza para interrumpir la ejecución del bloque de código del bucle, pero en lugar de salir del bucle, avanza a la siguiente iteración. En el caso de bucles iterativos, el iterador se desplaza al siguiente elemento de la secuencia de iteración, mientras que en los bucles condicionales, la evaluación de la condición de repetición se reinicia.
# Crear un vector de números del 1 al 10
numeros <- 1:10
# Iterar sobre cada número en el vector
for (num in numeros) {
# Imprimir el número actual
cat("Número actual:", num, "\n")
# Comprobar si el número es par
if (num %% 2 == 0) {
cat("Este número es par.\n")
} else {
cat("Este número es impar.\n")
}
# Si el número es mayor que 5, salir del bucle
if (num > 5) {
cat("El número es mayor que 5. Salir del bucle.\n")
break
}
# Si el número es divisible por 3, pasar al siguiente número
if (num %% 3 == 0) {
cat("Este número es divisible por 3. Continuar con el siguiente número.\n")
next
}
# Imprimir un espacio en blanco para separar cada iteración
cat("\n")
}
## Número actual: 1
## Este número es impar.
##
## Número actual: 2
## Este número es par.
##
## Número actual: 3
## Este número es impar.
## Este número es divisible por 3. Continuar con el siguiente número.
## Número actual: 4
## Este número es par.
##
## Número actual: 5
## Este número es impar.
##
## Número actual: 6
## Este número es par.
## El número es mayor que 5. Salir del bucle.
# Contador hasta cierto límite
contador<-0
limite <- 10
while (contador < limite) {
print(paste("El contador es:", contador))
contador <- contador + 1
}
## [1] "El contador es: 0"
## [1] "El contador es: 1"
## [1] "El contador es: 2"
## [1] "El contador es: 3"
## [1] "El contador es: 4"
## [1] "El contador es: 5"
## [1] "El contador es: 6"
## [1] "El contador es: 7"
## [1] "El contador es: 8"
## [1] "El contador es: 9"
# Generación de números pares
numero <- 0
limite <- 10
while (numero < limite) {
if (numero %% 2 == 0) {
print(paste("Número par:", numero))
}
numero <- numero + 1
}