En este ejercicio se muestra como asignar valores a variables, y hacer algunas operaciones basicas.

Por ejemplo para asignar a la variable altura el valor de 2:

altura <- 2

de modo que el sistema en RStudio ahora tiene almacenada la variable altura, para comprobar esto podemos ver en el recuadro donde apaarecen las variables de ambiente, o simplemente preguntando al sistema en la sección de comandos por esta variable haciendo

altura 
## [1] 2

también podemos teeclear lo siguiente

ls()
## [1] "altura"

este último nos dira las variables almacenadas hasta el momento. De manera que si instruducimos una nueva variable

base <- 4

y tecleamos

ls()
## [1] "altura" "base"

aparecen las dos variables que tenemos en el sistema. Con estas dos variables en el sistema podemos por ejemplo caclular el area, multiplicando base por altura

base * altura
## [1] 8

y quiza incluso guardar el resultado en una nueva variable llamada area

area <- base * altura
area
## [1] 8

Ahora si deseamos hacer este cálculo una siquiente vez, podriamos quiza guardar la serie de pasos en un archivo tipo texto “Ejemplo01.R” y despues ejecutar estos comandos utilizando la consola de R

Si deseamos calcular 3 + 4, debemos teclear

3 + 4
## [1] 7

Para efectuar una multiplicación podemos simplemente

10*10
## [1] 100

Para calcular un logaritmo (base 10), tenemos que teclear

log10(100)
## [1] 2

también podemos mostrar cierto texto, por ejemplo

"Bienvenidos a la BUAP y al curso de R"
## [1] "Bienvenidos a la BUAP y al curso de R"

Tipos de Variables (objetos)

Una fortaleza importante de R es que es muy rico en los tipos de objetos que admite. Pero ahora, esa fuerza es más bien una desventaja, ya que estamos comenzando o aprendiendo R por primera vez. Pero para comenzar, solo necesitas familiarizarse con algunos tipos de objetos, que llamaremos objetos básicos.Podemos citar tres objetos básicos importantes:

“Atomic vector"
"list"
 NULL

Hay tres variedades de vectores atómicos que son muy usadas:

“numeric”
“logical”
“character”

Lo que usted debe recordar acerca de los objeto citados es que todos son del tipo de objeto “Atomic Vector”

El segundo objeto son las listas (“list”). Estas pueden tener diferentes tipos de elementos en diferentes componentes. Se permite que un componente de una lista sea otra lista, así como un vector atómico (y otras cosas !).

Finalmente, el tecer objeto es “NULL”. Este es un objeto que tiene longitud cero. Prácticamente todos los demás objetos con los que trabaje tendrán una longitud mayor que cero.

Noten que además, existen tres tipos importantes de lo que podría llamarse objetos derivados o no básicos.

“matrix"
“dataframe”
“factor”

Las matrices (“matrix”) y los marcos de datos (“dataframe”) son objetos de datos rectangulares. La diferencia entre ellos es que todo en una matriz debe ser del mismo tipo atómico, pero los “dataframe” de datos pueden tener diferentes tipos de objetos en diferentes columnas. Pero cada columna de un cuadro de datos “data frame” tiene que ser de un solo tipo.

Una matriz puede verse exactamente como un “dataframe”, pero se implementan de manera completamente diferente. A veces no importa si tiene una matriz o un marco de datos. Otras veces es muy importante saber cuál tienes.

Hasta ahora hemos mostrado ciertas operaciones con variables y definimos algunos de los objetos más importantes. Así que esperamos que este primer acercamiento a R genere impaciencia por aprender esta valiosa herramineta.

Se recomienda continuar leyendo y practicando a través de este documento, pero en algún momento consultar los siguientes sitios web

https://www.statmethods.net/

https://pj.freefaculty.org/R/Rtips.html

https://www.pluralsight.com/search?q=R

http://www.introductoryr.co.uk/R_Resources_for_Beginners.html

Acciones básicas con los objetos.

Existen tres acciones básicas que podemos hacer a los objetos: asignación (assignment), subíndice (subscripting) y generación aleatoria (random generation).

La primera acción ya le hemos practicado cuando asignamos el valor de “2” a la variable “altura”.

altura <- 2

Así mismo, podemos asignar a una variable un vector, este contiene por ejemplo los numeros del uno al nueve

mi_vector <- c(1,2,3,4,5,6,7,8,9)

También,podemos asignar el resultado de alguna operación a otra variable, por ejemplo el promedio de la suma de los elementos del vector “mi_vector” lo calculamos con la función “mean()” y asignamos este valor promedio a la variable “prom”

prom <- mean(mi_vector)

Noten que una vez ejecutada linea anterior, aparecerá la variable “prom” en la ventana de las variables de entorno.

La acción de “subscripting” es importante para extraer elementos de los objetos (no es la única manera). Esta acción se lleva a cabo empleando corchetes “[]”. Por ejemplo, si deseamos extraer el primer elemento de “mi_vector” tecleamos:

mi_vector[1]
## [1] 1

Este comando también puede extraer elementos de una matriz. Vamos a crear una matriz para practicar. Para ello empleamos el vector “mi_vector” y la función “matrix”

mat1 <- matrix(mi_vector,nrow=3,ncol=3,byrow=TRUE)
mat1
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9

Ahora podemos extraer por ejemplo, el elemento que se encuentra en el renglón 2 y columna 2

mat1[2,2]
## [1] 5

Esta acción no solo sirve para extraer elementos, también se puede utilizar para reemplazar elementos (no es la única manera). Por ejemplo, en el vector “mi_vector” el segundo elemento es el valor “2”, y podemos reemplazarlo por un 10

mi_vector[2] <- 10

revisen en la ventana de las variables de ambiente que el segundo elemento de “mi_vector” ahora es diez. También en la matriz “mat1” podemos reemplazar el 5 por un 20.

mat1[2,2] <- 20
mat1
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4   20    6
## [3,]    7    8    9

Hay varias funciones que sirven para crear números de manera aleatoría. Por ejemplo, el comando

 runif(9)
## [1] 0.42160604 0.21904128 0.74637135 0.10245935 0.37317242 0.53473411 0.72009256
## [8] 0.05742904 0.45477737

crea un vector de 9 números que se distribuyen uniformemente entre 0 y 1. Note, que si ejecuta nuevamente este comando, obtendrá diferentes respuestas.

La creción de graficas es otra de las acciones más importantes. La siguiente sección está dedicada a analizar varios ejemplos de creación de distintos tipos de graficos.

Gráficas basicas

Ahora vamos a mostrar ejemplos de varios tipos de graficos, entre ellos histogramas, graficos de puntos, barras, linea, pie, caja y los de disperisón. Para ello, utilizaremos los datos del paquete “datos”. En caso de ser necesariom puede instalar empleando install.package("datos")

Y después habilitar la libreria “mtcars”

attach(mtcars)
mtcars
##                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
## Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
## Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
## Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
## Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
## Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
## Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
## Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
## Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
## Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
## Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
## Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
## Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
## Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
## Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
## Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
## Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
## Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
## AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
## Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
## Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
## Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
## Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
## Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
## Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
## Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
## Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
## Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

como puede observar esta base de datos (autos) contiene 32 tipos de vehiculos y 11 caracteristicas (cilindrada, caballos, etc.). Si se desea obervar si existe una correlación entre las variables “mpg” y “wt” podemos hacer el siguiente grafico

plot(wt, mpg) 

Es claro que a medida que “wt” aumenta, la variable “mpg” disminuye casi linealmente. Para poder observar esta tendencia podemos ajustar un a recta al grafico

plot(wt, mpg) 
abline(lm(mpg~wt))

dicho sea de paso, una de las cosas fundamentales es aprender a guardar una imagen o gráfica. Para ello, podemos guardar en diferentes formatos empleando las opciones del menú gráfico. Pero también se puede emplear codigo, aqui algunas opciones

pdf("mi_grafica.pdf")   
png("mi_grafica.png")
jpeg("mi_grafica.jpg")
bmp("mi_grafica.bmp")
postscript("mi_grafica.ps")

Noten que después de la ejecución de las lineas anteriores se deberán generar alrchivos “mi_grafica.*” en los distintos formatos.

Para crear un histograma, hay que acudir a la función “hist”. En este ejemplo deseamos ver la distribución de la caracterísitca “mpg”

hist(mtcars$mpg)

Otra manera de observar la distribución de los datos, es empleando graficos de densidad “density plots”. Usualmente son mas efectivos. Primero generamos datos de densidad de la misma variable “mpg”, y asignamos estos datos a la variable “d”, y posteriormente graficamos la variable “d”.

d <- density(mtcars$mpg)
plot(d)  

También es posible observar (sobre poner) mas de dos graficos de densidad, para ello se emplea la libreria “sm” que esta dentro del paquete “SM”

library(sm)
## Package 'sm', version 2.2-5.7: type help(sm) for summary information
attach(mtcars)
## The following objects are masked from mtcars (pos = 4):
## 
##     am, carb, cyl, disp, drat, gear, hp, mpg, qsec, vs, wt
cyl.f <- factor(cyl, levels= c(4,6,8),
  labels = c("4 cil", "6 cil", "8 cil")) 
sm.density.compare(mpg, cyl, xlab="Mi/Gal")

Generar datos artificales y crear graficas de correlación

Una de las principales razones por las que los analistas de datos recurren a R es por sus sólidas capacidades gráficas. Para empezar podemos considerar un conjunto ficticio de datos, que corresponde a 5 variables cada una de 100 muestras. Los datos los vamos a generar utilizando la función de distribución normal (“rnorm”)

# Crear datos 
sample_data <- data.frame( v1 = 1:100 + rnorm(100,sd=20), 
                           v2 = 1:100 + rnorm(100,sd=27), 
                           v3 = rep(1, 100) + rnorm(100, sd = 1))

y agregamos un par de columnas más (4 y 5) que corresponden al cuadrado de los elementos de la primera columna y al negativo del cuadrado de la primera columna respectivamente.

sample_data$v4 = sample_data$v1 ** 2
sample_data$v5 = -(sample_data$v1 ** 2) 

Si se desea explorar los datos recien creados, podemos simplemente buscar la variable “sample_data”, en la ventana de las variable de entorno (Environment), y haciendo click en ella podemos ver la tabla de datos gerenada. Ahora si deseamos ver la distribución de datos de cada una de las columnas podemos podemos utilizar un histograma de alguna de las columnlas, en especifico de la primera columna, tecleando lo siguiente

hist(sample_data$v1)

Ahora, comencemos a analizar si los datos de cada columna o variable (v1,v2,..,v5) se correlacionan. Primero, debemos instalar la librería GGally, esto se logra utilizando de la barra de herramientas Tools->InstallPackages y ahí tecleamos GGally. Posteriormente desde la consola debemos teclear para cargar las librerías que contienen los datos

library(GGally)
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.1.2
## 
## Attaching package: 'ggplot2'
## The following object is masked from 'mtcars':
## 
##     mpg
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2

Ahora estamos listos para revisar si existe una correlación entre las variables

# Verificar si hay correlación entre las variables
cor(sample_data) 
##            v1         v2         v3         v4         v5
## v1  1.0000000  0.6707406 -0.2010059  0.9367640 -0.9367640
## v2  0.6707406  1.0000000 -0.1253160  0.6317074 -0.6317074
## v3 -0.2010059 -0.1253160  1.0000000 -0.1505134  0.1505134
## v4  0.9367640  0.6317074 -0.1505134  1.0000000 -1.0000000
## v5 -0.9367640 -0.6317074  0.1505134 -1.0000000  1.0000000

Los valores desplegados corresponden al coeficiente de correlación. Los valores negativos indican una correlación negativa (anti-correlación), mientras que los valores positivos indican correlación directa. La anti-correlación significa que cuando una de las variables aumenta la otra disminuye. Valores cercanos a la unidad representan una buena correlación o anti-correlación. También podemos visualizar las correlaciones a través de un gráfico de dispersión, y ver el coeficiente de correlación

# grafica de dispersión de puntos y coeficiente de corr 
ggpairs(sample_data) 

Otra opción es emplear la función “plot” definida por default en RStudio,

plot(sample_data , pch=20 , cex=1.5 , col=rgb(0.5, 0.8, 0.9, 0.7))

Otra gráfica de correlación

ggcorr(sample_data, method = c("everything", "pearson")) 

Mapas de información georeferenciada

RStudio también es capaz de utilizar información georeferenciada y crear mapas. Debemos instalar los paquetes correspondientes, tecleando en la consola “install.packages(”tidyverse“)”, “install.packages(”maps“)” y también “intall.packages(”ggrepel“)”, después cargar las librerías.

# Libreria
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ tibble  3.1.2     ✓ dplyr   1.0.6
## ✓ tidyr   1.2.0     ✓ stringr 1.4.0
## ✓ readr   2.0.1     ✓ forcats 0.5.1
## ✓ purrr   0.3.4
## Warning: package 'tidyr' was built under R version 4.1.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()

Necesitamos obtener poligonos del mundo y extrar el de Reino Unido (por ejemplo)

library(maps)
## 
## Attaching package: 'maps'
## The following object is masked from 'package:purrr':
## 
##     map
UK <- map_data("world") %>% filter(region=="UK")

Debemos colectar datos georeferenciados (longitud, latitud) para Reino Unido

# Obtener datos para la región del Reino Unido 
data=world.cities %>% filter(country.etc=="UK")

Ahora resulta bastante directo graficar estos datos en un mapa. Para ello vamos a utilizar “geom_polygon” para generar la división politica de Reino Unido, y agregar los datos georeferenciados sobre el mapa

# Left chart
ggplot() +
  geom_polygon(data = UK, aes(x=long, y = lat, group = group), fill="grey", alpha=0.3) +
  geom_point( data=data, aes(x=long, y=lat)) +
  theme_void() + ylim(50,59) + coord_map() 

Un segundo mapa

# Second graphic with names of the 10 biggest cities
library(ggrepel)
ggplot() +
  geom_polygon(data = UK, aes(x=long, y = lat, group = group), fill="grey", alpha=0.3) +
  geom_point( data=data, aes(x=long, y=lat, alpha=pop)) +
  geom_text_repel( data=data %>% arrange(pop) %>% tail(10), aes(x=long, y=lat, label=name), size=5) +
  geom_point( data=data %>% arrange(pop) %>% tail(10), aes(x=long, y=lat), color="red", size=3) +
  theme_void() + ylim(50,59) + coord_map() +
  theme(legend.position="none")