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"
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://pj.freefaculty.org/R/Rtips.html
https://www.pluralsight.com/search?q=R
http://www.introductoryr.co.uk/R_Resources_for_Beginners.html
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.
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")
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"))
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")