Introduccion Lenguaje R

Por Jose R. Zapata

En este notebook se encuentra los temas mas importantes para el uso de R en ciencia de datos, se debe tener un un conocimiento basico de programacion para entender completamente el notebook.

El desarrollo de este codigo se realizara en google Colab

Invítame a un Café

En base a las herramientas actuales para el desarrollo de proyectos y productos de Ciencia de datos y Machine Learning, se recomienda el uso de Python, sin embargo, R es una herramienta muy poderosa para el análisis de datos y la visualización de los mismos.

Puede aprender python en el curso de Ciencia de Datos con Python.

R Basico

R.version.string

‘R version 4.4.1 (2024-06-14)’

Definir el directorio de trabajo

R necesita que se defina el directorio donde se esta trabajando, en jupyter notebook el directorio sera desde donde se ejecuta en el terminal el comando Jupyter notebook

#Obtener el directorio de trabajo actual
DirTrabajo <-getwd()
DirTrabajo

‘/content’

## Definir otro directorio para trabajar
setwd(dir = './sample_data') # ir a la carpeta sample_data de google colab
getwd() #ver cual es el directorio actual de trabajo

‘/content/sample_data’

setwd(DirTrabajo) # regresar al directorio original de trabajo
getwd()

‘/content’

Instalar e Importar Paquetes

R tiene un repositorio donde estan la mayoria de paquetes: https://cran.r-project.org/web/packages/available_packages_by_name.html

  • Desde el menu en Rstudio en: Packages->Install package(s).
# Importar una libreria
library(stringr) # Esta ya esta instalada
library(audio) #Este Paquete no esta instalado
Error in library(audio): there is no package called ‘audio’
Traceback:


1. library(audio)
require(audio) # devuelve TRUE o FALSE según el paquete esté o no instalado
Loading required package: audio

Warning message in library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE, :
“there is no package called ‘audio’”

Instalar, Eliminar y actualizar paquetes en CRAN

# Antes de instalar un paquete es bueno detectar si ya esta instalado
if(!require(audio)) # verificar si esta instalado el paquete
    install.packages("audio") # Comando para instalar paquetes, note las dobles comillas
library(audio) #Importar libreria
Loading required package: audio

Warning message in library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE, :
“there is no package called ‘audio’”
Installing package into ‘/usr/local/lib/R/site-library’
(as ‘lib’ is unspecified)
# Quitar un paquete de la memoria
detach("package:audio", unload=TRUE)
# Eliminar un paquete instalado
remove.packages("audio") #es necesario las dobles comillas
Removing package from ‘/usr/local/lib/R/site-library’
(as ‘lib’ is unspecified)
# Actualizar paquetes de cran
update.packages() #se recomienda por linea de comando
if(!require(sos)) # antes de instalar verificar si esta instalado el paquete
    install.packages("sos") # Comando para instalar paquetes, note las dobles comillas

library(sos) #Importar libreria
Loading required package: sos

Loading required package: brew


Attaching package: ‘sos’


The following object is masked from ‘package:utils’:

    ?
findFn("audio")# Buscar paquetes que contengan la palabra audio
found 600 matches;  retrieving 30 pages
2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30

Downloaded 597 links in 123 packages.

Obteniendo ayuda con R

Además de una búsqueda en google o de visitar StackOverflow, hay algunas maneras incorporadas de obtener ayuda con R! La mayoría de las funciones R tienen documentación en línea.

  • help(algo) documentacion
  • help.search(“algo”) Busca en la ayuda
  • apropos(“algo”) nombre de todos los objetos parecidos a ”algo”
  • help.start() Inicia la version HTML de la ayuda
# Necesita ayuda con vectors
help(vector)
# Debe ser un string
help.search('numeric')
# Tambien se puede usar ??para buscar
??vector

Aritmetica con R

1+2 #Suma

3

5-3  # Resta

2

1/2 # Division

0.5

2^3 # Potenciacion

8

5 %% 2 # Modulo

1

(100 * 2) + (50 / 2) #Orden de las operaciones

225


Variables

En R la asignacion de variables se hace asi:

# Observe que parece una flecha apuntando hacia la variable.
variable.name <- 100
# Veamos la variable
variable.name

100

bank.account <- 100
deposit <- 10
bank.account <- bank.account + deposit
bank.account

110

Tipos de datos en R

Punto Flotante

n <- 2.2
n # Jupyter notebook muestra las variables solo escribiendolas

2.2

Enteros

i <- 5
i

5

Boolean o logicos

t <- TRUE
f <- FALSE
t

TRUE

f

FALSE

Caracteres (Characters)

los datos tipo Texto/string son conocidos como characters en R.

# Comillas dobles
char <- "Data scientists, according to interviews and expert estimates, spend from 50 percent to 80 percent of their time mired in this more mundane labor of collecting and preparing unruly digital data, before it can be explored for useful nuggets"
char

‘Data scientists, according to interviews and expert estimates, spend from 50 percent to 80 percent of their time mired in this more mundane labor of collecting and preparing unruly digital data, before it can be explored for useful nuggets’

# Comillas simples
c <- 'Hola Mundo!'
c

‘Hola Mundo!’

Verificar la clase de los Datos

Se puede realizar con la funcion class():

class(t)

’logical'

class(f)

’logical'

class(char)

‘character’

class(c)

‘character’

class(n)

’numeric'

class(i)

’numeric'

class(Inf)

’numeric'

class(NaN)

’numeric'

class(4+5i)

‘complex’

Verificar el tipo de los Datos

Se puede realizar con la funcion typeof():

typeof(t)

’logical'

typeof(f)

’logical'

typeof(char)

‘character’

typeof(c)

‘character’

typeof(n)

‘double’

typeof(i)

‘double’

typeof(Inf)

‘double’

typeof(NaN)

‘double’

typeof(4+5i)

‘complex’

Manejo de Variables en el workspace

# listado de las variables en el workspace
ls()
  1. 'bank.account'
  2. 'c'
  3. 'char'
  4. 'deposit'
  5. 'DirTrabajo'
  6. 'f'
  7. 'i'
  8. 'n'
  9. 't'
  10. 'variable.name'
# Borrar una variable del workspace
rm(deposit)
ls()
  1. 'bank.account'
  2. 'c'
  3. 'char'
  4. 'DirTrabajo'
  5. 'f'
  6. 'i'
  7. 'n'
  8. 't'
  9. 'variable.name'

Impresion en pantalla

Se realiza con la funcion print() y pueden ser numeros o strings. En jupyter notebook no es necesario la funcion print para imprimir el valor de una variable.

print("Ciencia de Datos")
[1] "Ciencia de Datos"
x <- 10
print(x)
[1] 10
x <- mtcars
print(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

Formatos

Podemos imprimir con formato strings y variables de diferentes maneras:

paste()

Concatena los elementos mediante un separador definido paste (..., sep = " ")

print(paste('Hola','Mundo')) # El espacio es el separador predeterminado
[1] "Hola Mundo"
print(paste('Hola','Mundo',sep='-|-')) # puedo definir cualquier separador
[1] "Hola-|-Mundo"

paste0()

Concatena pero sin separador

paste0('Hola','Mundo')

‘HolaMundo’

sprint

es un contenedor para la función C sprintf, que devuelve un vector de caracteres que contiene una combinación formateada de texto y valores variables. Lo que significa que puede usar% códigos para colocar variables especificando todas al final.

sprintf("%s mide %f mt de alto\n", "Jose", 1.85) #\n es para dar un salto de linea

‘Jose mide 1.850000 mt de alto\n’

# Esto producira un error por que 1.85 es un float y no un integer
sprintf("%s mide %f mt de alto\n", "Jose", 1.85)

‘Jose mide 1.850000 mt de alto\n’

Para mas ayuda de como usar la funcion sprintf() se peude ver en la documentacion:

help(sprintf)

Vectores en R

Los vectores son una de las estructuras de datos clave en R. Un vector es una matriz o arreglo de 1 dimensión que puede contener elementos de tipo string, numéricos o lógicos. Podemos crear un vector usando la función de combinación c (). Para usar la función, pasamos los elementos que queremos en la matriz, con cada elemento individual separado por una coma.

# Usando c() para crear un vector con elementos numericos
nvec <- c(1,2,3,4,5)
class(nvec)

’numeric'

# Vector de letras
cvec <- c('U','S','A')
class(cvec)

‘character’

# vector de Booleans
lvec <- c(TRUE,FALSE)
lvec
  1. TRUE
  2. FALSE
class(lvec)

’logical'

Tenga en cuenta que no podemos mezclar los tipos de datos de los elementos en una matriz, R convertirá los otros elementos en la matriz para obligar a que todo sea del mismo tipo de datos. Más adelante, aprenderemos sobre la estructura de datos de la lista que puede tomar múltiples tipos de datos. A continuación, se muestra un ejemplo rápido de lo que ocurre con las matrices con diferentes tipos de datos:

v <- c(FALSE,2)
v
  1. 0
  2. 2
class(v)

’numeric'

v <- c('A',1)
v
  1. 'A'
  2. '1'
class(v)

‘character’

Nombres de vectores

Podemos usar la función names() para asignar nombres a cada elemento de nuestro vector. Por ejemplo, imagine el siguiente vector de una semana de temperaturas:

temps <- c(72,71,68,73,69,75,71)
temps
  1. 72
  2. 71
  3. 68
  4. 73
  5. 69
  6. 75
  7. 71

Tenemos 7 temperaturas durante 7 días de la semana, pero ¿qué temperatura corresponde a qué día de la semana? ¿Comienza el lunes, el domingo u otro día de la semana? Aquí es donde se pueden asignar los nombres() de la siguiente manera:

names(temps) <- c('Mon','Tue','Wed','Thu','Fri','Sat','Sun')

Note que pasa cuadno se muestra el vector

temps
Mon
72
Tue
71
Wed
68
Thu
73
Fri
69
Sat
75
Sun
71

¡Ahora podemos comenzar a ver cómo se les asignaron nombres a los elementos! Dependiendo de qué IDE esté utilizando, puede ver lo que se muestra arriba horizontalmente o verticalmente, podemos usar el uso simple de un nombre de variable como asignación de names(), por ejemplo:

days <- c('Mon','Tue','Wed','Thu','Fri','Sat','Sun')
temps2 <- c(1,2,3,4,5,6,7)
names(temps2) <- days
temps2
Mon
1
Tue
2
Wed
3
Thu
4
Fri
5
Sat
6
Sun
7

Operaciones con Vectores

Podemos realizar aritmética básica con vectores y las operaciones se realizarán elemento a elemento, por ejemplo:

v1 <- c(1,2,3)
v2 <- c(5,6,7)

Suma de Vectores

v1+v2
  1. 6
  2. 8
  3. 10

Resta de Vectores

v1-v1
  1. 0
  2. 0
  3. 0
v1-v2
  1. -4
  2. -4
  3. -4

Multiplicacion de Vectores

v1*v2
  1. 5
  2. 12
  3. 21

Division de vectores

v1/v2
  1. 0.2
  2. 0.333333333333333
  3. 0.428571428571429

Funciones con vectores

Aprendamos algunas funciones útiles que podemos usar con vectores. Una función tendrá el siguiente formato: nombre_de_la_funcion(input) Luego aprenderemos a crear nuestras propias funciones, pero R viene con una gran cantidad de funciones integradas que usará habitualmente. Por ejemplo, si desea sumar todos los elementos en un vector numérico, puede usar la función sum(). Por ejemplo:

v1
  1. 1
  2. 2
  3. 3
sum(v1)

6

También podemos verificar cosas como la desviación estándar, la varianza, el elemento máximo, el elemento mínimo, el producto de los elementos:

v <- c(12,45,100,2)
# Desviacion estandar
sd(v)

44.1691823182937

# Varianza
var(v)

1950.91666666667

# Elemento con valor maximo
max(v)

100

#Elemento con el minimo valor
min(v)

2

# Producto interno de los elementos
prod(v1)
prod(v2)

6

210

# Una de las funciones mas utiles es summary()
# que nos da la informacion estadistica de cuartiles
summary(v)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
   2.00    9.50   28.50   39.75   58.75  100.00

Referencia a todas las funciones de R en: https://cran.r-project.org/doc/contrib/Short-refcard.pdf

Indexación y slicing de vectores

Se usan los corchetes para indexar y acceder a elementos individuales desde un vector, el index empieza en 1:

v1 <- c(100,200,300)
v2 <- c('a','b','c')
v1
v2
  1. 100
  2. 200
  3. 300
  1. 'a'
  2. 'b'
  3. 'c'

La indexación funciona usando corchetes y pasando la posición del índice del elemento como un número. Tenga en cuenta que el índice comienza en 1 (en otros lenguajes de programación la indexación comienza en 0 por ejemplo Python, C++).

# Obtener el segundo elemento
v1[2]

200

v2[2]

‘b’

Indexación múltiple

Podemos tomar múltiples elementos de un vector pasando un vector con las posiciones de los índices dentro de los corchetes. Por ejemplo:

v1[c(1,2)] # tomar el elemento 1 y 2
  1. 100
  2. 200
v2[c(2,3)] # tomar el elemento 2 y 3
  1. 'b'
  2. 'c'
v2[c(1,3)] # tomar el elemento 1 y 3
  1. 'a'
  2. 'c'

Slicing

Puede usar dos puntos (:) para indicar una porción de un vector.

El formato es: vector[inicio_index: final_index]

Se incluye los elementos del inicio y final

Por ejemplo:

v <- c(1,2,3,4,5,6,7,8,9,10)
v[2:4] # La indexacionempieza desde el numero 1
  1. 2
  2. 3
  3. 4
v[7:10]
  1. 7
  2. 8
  3. 9
  4. 10

Indexacion con nombres

v <- c(1,2,3,4)
names(v) <- c('a','b','c','d')
v['a']

a: 1

# Se pueden llamar en cualquier orden!
v[c('a','c','b')]
a
1
c
3
b
2

Operadores de comparación y selección

Se puede usar operadores de comparación para filtrar elementos de un vector. A veces esto se conoce como enmascaramiento lógico/booleano, porque está creando un vector de valores lógicos para filtrar los resultados que desea.

v
a
1
b
2
c
3
d
4
v>2
a
FALSE
b
FALSE
c
TRUE
d
TRUE

Pasamos este vector de valores lógicos a través de los paréntesis del vector y solo devolvemos los valores donde sea verdadera la condicion:

v[v>2]
c
3
d
4

Podemos asignarles nombres a las comparaciones logicas

filter <- v>2
filter
a
FALSE
b
FALSE
c
TRUE
d
TRUE
v[filter]
c
3
d
4

Operadores de Comparacion

En R, podemos usar operadores de comparación para comparar variables y devolver valores lógico

Mayor que

5 > 6

FALSE

6 > 5

TRUE

Se puede hacer elemento a elemento en un vector

v1 <- c(1,2,3)
v2 <- c(10,20,30)
v1 < v2
  1. TRUE
  2. TRUE
  3. TRUE

Mayor o Igual que

6 >= 6

TRUE

6 >= 5

TRUE

6 >= 7

FALSE

Menor y Menor o igual que

3 < 2

FALSE

2 <= 2

TRUE

!Mucho cuidado con los operadores de comparación y los números negativos! se Recomienda usar espaciado para mantener las cosas claras. Un ejemplo de una situación peligrosa:

var <- 1
var

1

# Comparando var menor que  -2
var < -2

FALSE

# Accidentalmente se reasgina var
var <- 2
var

2

Diferente

5 != 2

TRUE

5 != 5

FALSE

Igual

5 == 5

TRUE

2 == 3

FALSE

Comparacion con Vectores

v <- c(1,2,3,4,5)
v < 2
  1. TRUE
  2. FALSE
  3. FALSE
  4. FALSE
  5. FALSE
v == 3
  1. FALSE
  2. FALSE
  3. TRUE
  4. FALSE
  5. FALSE

Matrices con R

Crear una Matriz

Hemos aprendido acerca de los vectores que nos permiten almacenar elementos indexados. Una matriz nos permitirá tener una estructura de datos bidimensional que contiene elementos que constan del mismo tipo de datos. Antes de hablar sobre Matrix, debemos mostrar un consejo rápido para crear rápidamente vectores numéricos secuenciales, puede usar la notación de dos puntos de la división para crear vectores secuenciales:

1:10
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
v <- 1:10
v
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10

Para crear una matriz en R, se usa la función matrix(). Podemos pasar un vector en la matriz:

matrix(v) #Matriz de una sola dimension
A matrix: 10 × 1 of type int
1
2
3
4
5
6
7
8
9
10

Observe cómo se muestra la salida. Aquí tenemos una matriz bidimensional que tiene 10 filas por 1 columna. Ahora, ¿qué pasa si queremos especificar el número de filas? Podemos pasar el parámetro / argumento a la función de matriz llamada nrow que representa el número de filas:

matrix(v,nrow=2)
A matrix: 2 × 5 of type int
13579
246810

Ahora tenemos una matriz de 2 por 5. Tenga en cuenta que el argumento nrow permite que esto suceda. ¿Pero cómo decidimos la orden de relleno? Podríamos haber puesto columnas primero (como lo hicimos anteriormente) o haber completado las primeras filas de orden insecuencial. El argumento byrow le permite especificar si desea completar o no la matriz por filas o columnas. Por ejemplo:

matrix(1:12,byrow = FALSE,nrow=4)
A matrix: 4 × 3 of type int
159
2610
3711
4812
matrix(1:12, byrow=TRUE, nrow=4)
A matrix: 4 × 3 of type int
123
456
789
101112
v
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10

Crear Matrices de Vectores

Podemos combinar vectores para luego ingresarlos en una matriz. Por ejemplo, imagine los siguientes vectores a continuación de los precios de las acciones:

# no son valores reales
goog <- c(450,451,452,445,468)
msft <- c(230,231,232,236,228)
stocks <- c(goog,msft)
stock.matrix <- matrix(stocks,byrow=TRUE,nrow=2)
stock.matrix
A matrix: 2 × 5 of type dbl
450451452445468
230231232236228

Nombrando matrices

Ahora que tenemos nuestra matriz, sería bueno nombrar las filas y columnas para referencia. Podemos hacer esto de forma similar a la función names() para vectores, pero en este caso definimos colnames() y rownames().

days <- c('Mon','Tue','Wed','Thu','Fri')
st.names <- c('GOOG','MSFT')
colnames(stock.matrix) <- days
rownames(stock.matrix) <- st.names
stock.matrix
A matrix: 2 × 5 of type dbl
MonTueWedThuFri
GOOG450451452445468
MSFT230231232236228

Aritmetica de Matrices

Podemos realizar operaciones matemáticas elemento por elemento en una matriz con un escalar (número único) al igual que con los vectores.

mat <- matrix(1:50,byrow=TRUE,nrow=5)
mat
A matrix: 5 × 10 of type int
12345678910
11121314151617181920
21222324252627282930
31323334353637383940
41424344454647484950
# Multiplicacion
2*mat
A matrix: 5 × 10 of type dbl
2468101214161820
22242628303234363840
42444648505254565860
62646668707274767880
828486889092949698100
# Division
1/mat
A matrix: 5 × 10 of type dbl
1.000000000.500000000.333333330.250000000.200000000.166666670.142857140.125000000.111111110.10000000
0.090909090.083333330.076923080.071428570.066666670.062500000.058823530.055555560.052631580.05000000
0.047619050.045454550.043478260.041666670.040000000.038461540.037037040.035714290.034482760.03333333
0.032258060.031250000.030303030.029411760.028571430.027777780.027027030.026315790.025641030.02500000
0.024390240.023809520.023255810.022727270.022222220.021739130.021276600.020833330.020408160.02000000
# Division
mat/2
A matrix: 5 × 10 of type dbl
0.511.522.533.544.55
5.566.577.588.599.510
10.51111.51212.51313.51414.515
15.51616.51717.51818.51919.520
20.52121.52222.52323.52424.525
# Potencia
mat ^ 2
A matrix: 5 × 10 of type dbl
149162536496481100
121144169196225256289324361400
441484529576625676729784841900
961102410891156122512961369144415211600
1681176418491936202521162209230424012500

Operadores de comparacion con Matrices

mat > 17
A matrix: 5 × 10 of type lgl
FALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
FALSEFALSEFALSEFALSEFALSEFALSEFALSETRUETRUETRUE
TRUETRUETRUETRUETRUETRUETRUETRUETRUETRUE
TRUETRUETRUETRUETRUETRUETRUETRUETRUETRUE
TRUETRUETRUETRUETRUETRUETRUETRUETRUETRUE

Aritmetica con matrices

Elemento a elemento

mat + mat
A matrix: 5 × 10 of type int
2468101214161820
22242628303234363840
42444648505254565860
62646668707274767880
828486889092949698100
mat / mat
A matrix: 5 × 10 of type dbl
1111111111
1111111111
1111111111
1111111111
1111111111
#Cuidado, puede dar numeros grandes
mat ^ mat
A matrix: 5 × 10 of type dbl
1.000000e+004.000000e+002.700000e+012.560000e+023.125000e+034.665600e+048.235430e+051.677722e+073.874205e+081.000000e+10
2.853117e+118.916100e+123.028751e+141.111201e+164.378939e+171.844674e+198.272403e+203.934641e+221.978420e+241.048576e+26
5.842587e+273.414279e+292.088047e+311.333736e+338.881784e+346.156120e+364.434265e+383.314552e+402.567686e+422.058911e+44
1.706917e+461.461502e+481.291100e+501.175664e+521.102507e+541.063874e+561.055513e+581.075912e+601.125951e+621.208926e+64
1.330878e+661.501309e+681.734377e+702.050774e+722.480636e+743.068035e+763.877924e+785.007021e+806.600972e+828.881784e+84
mat*mat
A matrix: 5 × 10 of type int
149162536496481100
121144169196225256289324361400
441484529576625676729784841900
961102410891156122512961369144415211600
1681176418491936202521162209230424012500

Multiplicación de Matrices

mat2 <- matrix(1:9, nrow=3)
mat2
A matrix: 3 × 3 of type int
147
258
369
# Verdadera Multiplicacion de Matrices
mat2 %*% mat2
A matrix: 3 × 3 of type dbl
3066102
3681126
4296150

Operaciones de matriz

Ahora que aprendimos cómo crear una matriz, ¡aprendamos a usar funciones y realizar operaciones en ella!

# Precios
goog <- c(450,451,452,445,468)
msft <- c(230,231,232,236,228)

# Poner los vectores en la matriz
stocks <- c(goog,msft)
stock.matrix <- matrix(stocks,byrow=TRUE,nrow=2)

# Nombrar la matriz
days <- c('Mon','Tue','Wed','Thu','Fri')
st.names <- c('GOOG','MSFT')
colnames(stock.matrix) <- days
rownames(stock.matrix) <- st.names

# Mostrarla
stock.matrix
A matrix: 2 × 5 of type dbl
MonTueWedThuFri
GOOG450451452445468
MSFT230231232236228

Podemosrealizar funciones atraves de las columnas como colSums()

# Por columnas
colSums(stock.matrix)
Mon
680
Tue
682
Wed
684
Thu
681
Fri
696
# Por filas
rowSums(stock.matrix)
GOOG
2266
MSFT
1157

Tambien se pueden hacer diferentes operaciones matematicas,para mas informacion de todas las funciones disponibles: https://cran.r-project.org/doc/contrib/Short-refcard.pdf

# el valor promedio de cada fila
rowMeans(stock.matrix)
GOOG
453.2
MSFT
231.4

Agregar columnas y filas

Con cbind() se agregan nuevas columnas, y rbind() para nuevas filas.

FB <- c(111,112,113,120,145)
tech.stocks <- rbind(stock.matrix,FB)
tech.stocks
A matrix: 3 × 5 of type dbl
MonTueWedThuFri
GOOG450451452445468
MSFT230231232236228
FB111112113120145

Ahora agreguemos una columna con el valor promedio a la matriz:

avg <- rowMeans(tech.stocks)
avg
GOOG
453.2
MSFT
231.4
FB
120.2
tech.stocks <- cbind(tech.stocks,avg)
tech.stocks
A matrix: 3 × 6 of type dbl
MonTueWedThuFriavg
GOOG450451452445468453.2
MSFT230231232236228231.4
FB111112113120145120.2

Selección e indexación de matrices

Al igual que con los vectores, utilizamos la notación de corchetes para seleccionar elementos de una matriz. Como tenemos dos dimensiones para trabajar, utilizaremos una coma para separar la indexación para cada dimensión. La sintaxis es:

matriz.ejemplo[filas, columnas]

Si cualquiera de las filas o columnas se deja en blanco, entonces estamos seleccionando todas las filas y columnas.

# Creando una matriz de 50elementos de 5 x10
mat <- matrix(1:50,byrow=TRUE,nrow=5)
mat
A matrix: 5 × 10 of type int
12345678910
11121314151617181920
21222324252627282930
31323334353637383940
41424344454647484950
# Tomar la primera fila
mat[1,]
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
# Tomarla primera columna
mat[,1]
  1. 1
  2. 11
  3. 21
  4. 31
  5. 41
# Tomar las primeras 3 filas
mat[1:3,]
A matrix: 3 × 10 of type int
12345678910
11121314151617181920
21222324252627282930
# Tomar diferente numero de filas y columnas
# 1,2,3
# 11,12,13
#
mat[1:2,1:3]
A matrix: 2 × 3 of type int
123
111213
#Tomar las dos ultimas columnas
mat[,9:10]
A matrix: 5 × 2 of type int
910
1920
2930
3940
4950
# Tomar los valores centrales
# 15,16
# 25,26
mat[2:3,5:6]
A matrix: 2 × 2 of type int
1516
2526

Factor y Matrices categoricas

la función factor() sirve para crear matrices categóricas. Esta función específica será extremadamente útil cuando comencemos a aplicar técnicas de análisis de datos y aprendizaje automático a nuestros datos, esta idea a veces también se conoce como la creación de dummy variables (variables ficticias).

Comencemos mostrando un ejemplo de por qué y cómo construimos esta matriz. Imagine que tenemos los siguientes vectores que representan datos de un santuario de animales para dogs(’d’) y cats(‘c’), donde cada uno tiene un número de identificación correspondiente en otro vector.

animal <- c('d','c','d','c','c')
id <- c(1,2,3,4,5)

Queremos convertir el vector animal en información que un algoritmo o ecuación pueda comprender más fácilmente. Lo que significa que queremos comenzar a verificar cuántas categorías (niveles de factores) hay en nuestro vector de caracteres. Esto se hace con la funcion factor()

factor.ani <- factor(animal)
# Ver los niveles creados
factor.ani
  1. d
  2. c
  3. d
  4. c
  5. c
Levels:
  1. 'c'
  2. 'd'

Podemos ver que tenemos dos niveles, ’d’ y ‘c’. En R hay dos tipos distintos de variables categóricas, una variable categórica ordinal y una variable categórica nominal

Las variables categóricas nominales no tienen ningún orden, como perros y gatos (no hay ningún orden para ellos). Versus Las variables categóricas ordinales (como su nombre lo indica) sí tienen un orden. Por ejemplo, si tuvieras el vector:

ord.cat <- c('frio','tibio','caliente')

Puede comenzar a asignar para estas variables, como: frio tibio caliente si quiere asignar un orden mientras usa la función factor(), puede pasar los argumentos ordenados = True y el pase los niveles = y pasar en un vector en el orden en que desea que estén los niveles. Por ejemplo:

temps <- c('frio','tibio','frio','tibio','caliente','caliente','frio')
fact.temp <- factor(temps,ordered=TRUE,levels=c('frio','tibio','caliente'))
fact.temp
  1. frio
  2. tibio
  3. frio
  4. tibio
  5. caliente
  6. caliente
  7. frio
Levels:
  1. 'frio'
  2. 'tibio'
  3. 'caliente'

Esta información es útil cuando se usa junto con la función summary() que es una función sorprendentemente conveniente para obtener rápidamente información de una matriz o vector.

summary(temps)
   Length     Class      Mode
        7 character character
summary(fact.temp)
frio
3
tibio
2
caliente
2

Dataframes en R

Los Dataframes son una de las herramientas principales para el análisis de datos con R! Las entradas de la matriz eran limitadas porque todos los datos dentro de la matriz tenían que ser del mismo tipo de datos (numéricos, lógicos, etc.). ¡Con Dataframes podremos organizar y mezclar tipos de datos para crear una herramienta de estructura de datos muy poderosa!

# Dataframe sobre states
state.x77
A matrix: 50 × 8 of type dbl
PopulationIncomeIlliteracyLife ExpMurderHS GradFrostArea
Alabama361536242.169.0515.141.32050708
Alaska36563151.569.3111.366.7152566432
Arizona221245301.870.557.858.115113417
Arkansas211033781.970.6610.139.96551945
California2119851141.171.7110.362.620156361
Colorado254148840.772.066.863.9166103766
Connecticut310053481.172.483.156.01394862
Delaware57948090.970.066.254.61031982
Florida827748151.370.6610.752.61154090
Georgia493140912.068.5413.940.66058073
Hawaii86849631.973.606.261.906425
Idaho81341190.671.875.359.512682677
Illinois1119751070.970.1410.352.612755748
Indiana531344580.770.887.152.912236097
Iowa286146280.572.562.359.014055941
Kansas228046690.672.584.559.911481787
Kentucky338737121.670.1010.638.59539650
Louisiana380635452.868.7613.242.21244930
Maine105836940.770.392.754.716130920
Maryland412252990.970.228.552.31019891
Massachusetts581447551.171.833.358.51037826
Michigan911147510.970.6311.152.812556817
Minnesota392146750.672.962.357.616079289
Mississippi234130982.468.0912.541.05047296
Missouri476742540.870.699.348.810868995
Montana74643470.670.565.059.2155145587
Nebraska154445080.672.602.959.313976483
Nevada59051490.569.0311.565.2188109889
New Hampshire81242810.771.233.357.61749027
New Jersey733352371.170.935.252.51157521
New Mexico114436012.270.329.755.2120121412
New York1807649031.470.5510.952.78247831
North Carolina544138751.869.2111.138.58048798
North Dakota63750870.872.781.450.318669273
Ohio1073545610.870.827.453.212440975
Oklahoma271539831.171.426.451.68268782
Oregon228446600.672.134.260.04496184
Pennsylvania1186044491.070.436.150.212644966
Rhode Island93145581.371.902.446.41271049
South Carolina281636352.367.9611.637.86530225
South Dakota68141670.572.081.753.317275955
Tennessee417338211.770.1111.041.87041328
Texas1223741882.270.9012.247.435262134
Utah120340220.672.904.567.313782096
Vermont47239070.671.645.557.11689267
Virginia498147011.470.089.547.88539780
Washington355948640.671.724.363.53266570
West Virginia179936171.469.486.741.610024070
Wisconsin458944680.772.483.054.514954464
Wyoming37645660.670.296.962.917397203
# Gastos personales en US
USPersonalExpenditure
A matrix: 5 × 5 of type dbl
19401945195019551960
Food and Tobacco22.20044.50059.6073.286.80
Household Operation10.50015.50029.0036.546.20
Medical and Health3.5305.7609.7114.021.10
Personal Care1.0401.9802.453.45.40
Private Education0.3410.9741.802.63.64
# Mujeres
women
A data.frame: 15 × 2
heightweight
<dbl><dbl>
58115
59117
60120
61123
62126
63129
64132
65135
66139
67142
68146
69150
70154
71159
72164

Para obtener una lista de dataframes pre-instalados en R,use data()

data()

Trabajando con Dataframes

Cuando el dataframe es muy grande se puede usar la funcion head() y tail() para ver las primeras o ultimas 6 filas respectivamente.

#Asignacionde variable para escribir menos :)
states <- state.x77
head(states) #primeras 6 filas
A matrix: 6 × 8 of type dbl
PopulationIncomeIlliteracyLife ExpMurderHS GradFrostArea
Alabama361536242.169.0515.141.32050708
Alaska36563151.569.3111.366.7152566432
Arizona221245301.870.557.858.115113417
Arkansas211033781.970.6610.139.96551945
California2119851141.171.7110.362.620156361
Colorado254148840.772.066.863.9166103766
tail(states) #ultimas 6 filas
A matrix: 6 × 8 of type dbl
PopulationIncomeIlliteracyLife ExpMurderHS GradFrostArea
Vermont47239070.671.645.557.11689267
Virginia498147011.470.089.547.88539780
Washington355948640.671.724.363.53266570
West Virginia179936171.469.486.741.610024070
Wisconsin458944680.772.483.054.514954464
Wyoming37645660.670.296.962.917397203

Informacion General de los DataFrames

str() entrega la informacion de la estructura del dataframe y el tipo de datos que contiene, como el nombre de las variables y el tipo de datos.

summary() para obtener rapidamente informacion estadistica de cada columna, dependiendo de los datos puede ser su utilidad.

# Resumen estadistico de los datos
summary(states)
   Population        Income       Illiteracy       Life Exp
 Min.   :  365   Min.   :3098   Min.   :0.500   Min.   :67.96
 1st Qu.: 1080   1st Qu.:3993   1st Qu.:0.625   1st Qu.:70.12
 Median : 2838   Median :4519   Median :0.950   Median :70.67
 Mean   : 4246   Mean   :4436   Mean   :1.170   Mean   :70.88
 3rd Qu.: 4968   3rd Qu.:4814   3rd Qu.:1.575   3rd Qu.:71.89
 Max.   :21198   Max.   :6315   Max.   :2.800   Max.   :73.60
     Murder          HS Grad          Frost             Area
 Min.   : 1.400   Min.   :37.80   Min.   :  0.00   Min.   :  1049
 1st Qu.: 4.350   1st Qu.:48.05   1st Qu.: 66.25   1st Qu.: 36985
 Median : 6.850   Median :53.25   Median :114.50   Median : 54277
 Mean   : 7.378   Mean   :53.11   Mean   :104.46   Mean   : 70736
 3rd Qu.:10.675   3rd Qu.:59.15   3rd Qu.:139.75   3rd Qu.: 81162
 Max.   :15.100   Max.   :67.30   Max.   :188.00   Max.   :566432
# Estrutura de los Datos
str(states)
 num [1:50, 1:8] 3615 365 2212 2110 21198 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:50] "Alabama" "Alaska" "Arizona" "Arkansas" ...
  ..$ : chr [1:8] "Population" "Income" "Illiteracy" "Life Exp" ...

Crear Dataframes

Podemos crear dataframes usando la función data.frame() y pasar vectores como argumentos, que luego convertirán los vectores en columnas del marco de datos.

empty <- data.frame() # data frame vacio

c1 <- 1:10 # vector de enteros

c2 <- letters[1:10] # vector de strings

df <- data.frame(col.name.1=c1,col.name.2=c2)
df
A data.frame: 10 × 2
col.name.1col.name.2
<int><chr>
1a
2b
3c
4d
5e
6f
7g
8h
9i
10j
# Ejemplo con valores
# Algunos datos de la temperatura de los dias
days <- c('mon','tue','wed','thu','fri')
temp <- c(22.2,21,23,24.3,25)
rain <- c(TRUE, TRUE, FALSE, FALSE, TRUE)
# Conviertiendo los vectores en dataframe
df <- data.frame(days,temp,rain)
df
A data.frame: 5 × 3
daystemprain
<chr><dbl><lgl>
mon22.2TRUE
tue21.0TRUE
wed23.0FALSE
thu24.3FALSE
fri25.0TRUE
# estructura
str(df)
'data.frame': 5 obs. of  3 variables:
 $ days: chr  "mon" "tue" "wed" "thu" ...
 $ temp: num  22.2 21 23 24.3 25
 $ rain: logi  TRUE TRUE FALSE FALSE TRUE
# Resumen estadistico
summary(df)
     days                temp         rain
 Length:5           Min.   :21.0   Mode :logical
 Class :character   1st Qu.:22.2   FALSE:2
 Mode  :character   Median :23.0   TRUE :3
                    Mean   :23.1
                    3rd Qu.:24.3
                    Max.   :25.0

Seleccion e Indexacion de Dataframes

Se realiza utilizando corchetes [ ] y de la misma forma que con matrices df[filas,columnas]

# Toda la fila 1
df[1,]
A data.frame: 1 × 3
daystemprain
<chr><dbl><lgl>
1mon22.2TRUE
# Toda la columna 1
df[,1]
  1. 'mon'
  2. 'tue'
  3. 'wed'
  4. 'thu'
  5. 'fri'
# Tomar los datos del viernes
df[5,]
A data.frame: 1 × 3
daystemprain
<chr><dbl><lgl>
5fri25TRUE

Seleccion usando nombres de columnas

Se pueden usar los nombes de las columnas en vez de las posiciones de las columnas

# Todos los valores de la columna rain
df[,'rain']
  1. TRUE
  2. TRUE
  3. FALSE
  4. FALSE
  5. TRUE
# Primeas 5 filas de las columnas days y temp
df[1:5,c('days','temp')]
A data.frame: 5 × 2
daystemp
<chr><dbl>
1mon22.2
2tue21.0
3wed23.0
4thu24.3
5fri25.0

Si desea todos los valores de una columna en particular, puede usar el signo de dólar directamente después del dataframe de la siguiente manera (esta notacion es muy usada):

df.name$column.name

df$rain
  1. TRUE
  2. TRUE
  3. FALSE
  4. FALSE
  5. TRUE
df$days
  1. 'mon'
  2. 'tue'
  3. 'wed'
  4. 'thu'
  5. 'fri'

También puede usar la notación de corchetes para devolver un dataframe con la misma información:

df['rain']
A data.frame: 5 × 1
rain
<lgl>
TRUE
TRUE
FALSE
FALSE
TRUE
df['days']
A data.frame: 5 × 1
days
<chr>
mon
tue
wed
thu
fri

Filtrar un subconjunto de datos con condiciones

Podemos usar la función subset() para tomar un subconjunto de valores de nuestro dataframe en función de alguna condición. Entonces, por ejemplo, si quisiéramos tomar los días en los que llovió (rain = True), podemos usar la función subset() de la siguiente manera:

subset(df,subset=rain==TRUE)
A data.frame: 3 × 3
daystemprain
<chr><dbl><lgl>
1mon22.2TRUE
2tue21.0TRUE
5fri25.0TRUE

Observe cómo la condición utiliza algún tipo de operador de comparación, en el caso anterior ==. Tomemos días donde la temperatura era mayor que 23:

subset(df,subset= temp>23)
A data.frame: 2 × 3
daystemprain
<chr><dbl><lgl>
4thu24.3FALSE
5fri25.0TRUE

Otra cosa a tener en cuenta es que no pasamos el nombre de la columna como un string, el subconjunto sabe que se está refiriendo a una columna en ese dataframe.

Ordenar un Dataframe

Podemos organizar el orden de un dataframe utilizando la función order().

# Orden ascendente
sorted.temp <- order(df$temp)
df[sorted.temp,]
A data.frame: 5 × 3
daystemprain
<chr><dbl><lgl>
2tue21.0TRUE
1mon22.2TRUE
3wed23.0FALSE
4thu24.3FALSE
5fri25.0TRUE

Observemos en realidad de que tipo es sorted.temp:

sorted.temp
  1. 2
  2. 1
  3. 3
  4. 4
  5. 5
# Orden descendente poniendo el signo negativo
desc.temp <- order(-df$temp)
df[desc.temp,]
A data.frame: 5 × 3
daystemprain
<chr><dbl><lgl>
5fri25.0TRUE
4thu24.3FALSE
3wed23.0FALSE
1mon22.2TRUE
2tue21.0TRUE

Informacion de filas y columnas

# Numero de Filas y Columnas
nrow(df)
ncol(df)

5

3

# Nombres de las columnas
colnames(df)
  1. 'days'
  2. 'temp'
  3. 'rain'
# Nombre de las filas (En este dataframe son numeros)
rownames(df)
  1. '1'
  2. '2'
  3. '3'
  4. '4'
  5. '5'

Referenciando Celdas especificas

Se utiliza corchetes dobles para obtener un solo numero y corchetes simples para varias celdas

vec <- df[[5, 2]] # obtener la celda po [[fila,columna]]
vec

25

newdf <- df[1:3, 1:2] # tomar varias celdas
newdf
A data.frame: 3 × 2
daystemp
<chr><dbl>
1mon22.2
2tue21.0
3wed23.0
df[[2, 'temp']] <- 99999 # reasignando el valor en una celda
df
A data.frame: 5 × 3
daystemprain
<chr><dbl><lgl>
mon22.2TRUE
tue99999.0TRUE
wed23.0FALSE
thu24.3FALSE
fri25.0TRUE

Referenciando filas

# Retorna un dataframe (No un vector)
rowdf <- df[1, ]
rowdf
A data.frame: 1 × 3
daystemprain
<chr><dbl><lgl>
1mon22.2TRUE
#Para obtener un vector debe ser asi
vrow <- as.numeric(as.vector(df[1,]))
vrow
Warning message in eval(expr, envir, enclos):
“NAs introduced by coercion”
  1. <NA>
  2. 22.2
  3. 1

Referenciando Columnas

La mayoria de referencias de columna retornan un vector

# dataset de carros
cars <- mtcars
head(cars)
A data.frame: 6 × 11
mpgcyldisphpdratwtqsecvsamgearcarb
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl>
Mazda RX421.061601103.902.62016.460144
Mazda RX4 Wag21.061601103.902.87517.020144
Datsun 71022.84108933.852.32018.611141
Hornet 4 Drive21.462581103.083.21519.441031
Hornet Sportabout18.783601753.153.44017.020032
Valiant18.162251052.763.46020.221031
colv1 <- cars$mpg # retorna un vector
colv1
  1. 21
  2. 21
  3. 22.8
  4. 21.4
  5. 18.7
  6. 18.1
  7. 14.3
  8. 24.4
  9. 22.8
  10. 19.2
  11. 17.8
  12. 16.4
  13. 17.3
  14. 15.2
  15. 10.4
  16. 10.4
  17. 14.7
  18. 32.4
  19. 30.4
  20. 33.9
  21. 21.5
  22. 15.5
  23. 15.2
  24. 13.3
  25. 19.2
  26. 27.3
  27. 26
  28. 30.4
  29. 15.8
  30. 19.7
  31. 15
  32. 21.4
colv2 <- cars[, 'mpg'] # retorna un vector
colv2
  1. 21
  2. 21
  3. 22.8
  4. 21.4
  5. 18.7
  6. 18.1
  7. 14.3
  8. 24.4
  9. 22.8
  10. 19.2
  11. 17.8
  12. 16.4
  13. 17.3
  14. 15.2
  15. 10.4
  16. 10.4
  17. 14.7
  18. 32.4
  19. 30.4
  20. 33.9
  21. 21.5
  22. 15.5
  23. 15.2
  24. 13.3
  25. 19.2
  26. 27.3
  27. 26
  28. 30.4
  29. 15.8
  30. 19.7
  31. 15
  32. 21.4
colv3<- cars[, 1] # son int o string?
colv3
  1. 21
  2. 21
  3. 22.8
  4. 21.4
  5. 18.7
  6. 18.1
  7. 14.3
  8. 24.4
  9. 22.8
  10. 19.2
  11. 17.8
  12. 16.4
  13. 17.3
  14. 15.2
  15. 10.4
  16. 10.4
  17. 14.7
  18. 32.4
  19. 30.4
  20. 33.9
  21. 21.5
  22. 15.5
  23. 15.2
  24. 13.3
  25. 19.2
  26. 27.3
  27. 26
  28. 30.4
  29. 15.8
  30. 19.7
  31. 15
  32. 21.4
colv4 <- cars[['mpg']] # retorna un vector
colv4
  1. 21
  2. 21
  3. 22.8
  4. 21.4
  5. 18.7
  6. 18.1
  7. 14.3
  8. 24.4
  9. 22.8
  10. 19.2
  11. 17.8
  12. 16.4
  13. 17.3
  14. 15.2
  15. 10.4
  16. 10.4
  17. 14.7
  18. 32.4
  19. 30.4
  20. 33.9
  21. 21.5
  22. 15.5
  23. 15.2
  24. 13.3
  25. 19.2
  26. 27.3
  27. 26
  28. 30.4
  29. 15.8
  30. 19.7
  31. 15
  32. 21.4

Para retornar dataframes puederser asi:

mpgdf <- cars['mpg'] # retorna un dataframe de 1 col
head(mpgdf)
A data.frame: 6 × 1
mpg
<dbl>
Mazda RX421.0
Mazda RX4 Wag21.0
Datsun 71022.8
Hornet 4 Drive21.4
Hornet Sportabout18.7
Valiant18.1
mpgdf2 <- cars[1] # retorna un dataframe de 1 col
head(mpgdf2)
A data.frame: 6 × 1
mpg
<dbl>
Mazda RX421.0
Mazda RX4 Wag21.0
Datsun 71022.8
Hornet 4 Drive21.4
Hornet Sportabout18.7
Valiant18.1

Agregando Filas rbind()

df
A data.frame: 5 × 3
daystemprain
<chr><dbl><lgl>
mon22.2TRUE
tue99999.0TRUE
wed23.0FALSE
thu24.3FALSE
fri25.0TRUE
# Los dos argumentos son dataframes
df2 <- data.frame(days = "sat", temp = NA ,rain = TRUE )
df2
A data.frame: 1 × 3
daystemprain
<chr><lgl><lgl>
satNATRUE
# usar rbind para agregar una nueva fila
df <- rbind(df,df2)
df
A data.frame: 6 × 3
daystemprain
<chr><dbl><lgl>
mon22.2TRUE
tue99999.0TRUE
wed23.0FALSE
thu24.3FALSE
fri25.0TRUE
satNATRUE

Agregando Columnas cbind()

# crear una columna convalores NA
df$newcol <- rep(NA, nrow(df))
df
A data.frame: 6 × 4
daystemprainnewcol
<chr><dbl><lgl><lgl>
mon22.2TRUENA
tue99999.0TRUENA
wed23.0FALSENA
thu24.3FALSENA
fri25.0TRUENA
satNATRUENA
# Copiar una columna
df[, 'copy.of.temp'] <- df$temp
df
A data.frame: 6 × 5
daystemprainnewcolcopy.of.temp
<chr><dbl><lgl><lgl><dbl>
mon22.2TRUENA22.2
tue99999.0TRUENA99999.0
wed23.0FALSENA23.0
thu24.3FALSENA24.3
fri25.0TRUENA25.0
satNATRUENANA
# tambien se pueden usar ecuaciones
df[['temp.times.2']] <- df$temp * 2
df
A data.frame: 6 × 6
daystemprainnewcolcopy.of.temptemp.times.2
<chr><dbl><lgl><lgl><dbl><dbl>
mon22.2TRUENA22.244.4
tue99999.0TRUENA99999.0199998.0
wed23.0FALSENA23.046.0
thu24.3FALSENA24.348.6
fri25.0TRUENA25.050.0
satNATRUENANANA
# Usando la funcion cbind()
df3 <- cbind(df, df$temp)
df3
A data.frame: 6 × 7
daystemprainnewcolcopy.of.temptemp.times.2df$temp
<chr><dbl><lgl><lgl><dbl><dbl><dbl>
mon22.2TRUENA22.244.422.2
tue99999.0TRUENA99999.0199998.099999.0
wed23.0FALSENA23.046.023.0
thu24.3FALSENA24.348.624.3
fri25.0TRUENA25.050.025.0
satNATRUENANANANA

Definir el Nombre de las Columnas

# Renombrar unacolumna
colnames(df)[5] <- 'copia.Temperatura'
df
A data.frame: 6 × 6
daystemprainnewcolcopia.Temperaturatemp.times.2
<chr><dbl><lgl><lgl><dbl><dbl>
mon22.2TRUENA22.244.4
tue99999.0TRUENA99999.0199998.0
wed23.0FALSENA23.046.0
thu24.3FALSENA24.348.6
fri25.0TRUENA25.050.0
satNATRUENANANA
# Renombrar todas con un vector
colnames(df) <- c('col.name.1', 'col.name.2', 'col.name.3', 'col.name.4' ,'copy.temp','temp2')
df
A data.frame: 6 × 6
col.name.1col.name.2col.name.3col.name.4copy.temptemp2
<chr><dbl><lgl><lgl><dbl><dbl>
mon22.2TRUENA22.244.4
tue99999.0TRUENA99999.0199998.0
wed23.0FALSENA23.046.0
thu24.3FALSENA24.348.6
fri25.0TRUENA25.050.0
satNATRUENANANA

Seleccion de varias Filas

# Seleccionar solo algunas filas
primeras.cuatro.filas <- df[1:4, ] # Lo mismo que head(df, 4)
primeras.cuatro.filas
A data.frame: 4 × 6
col.name.1col.name.2col.name.3col.name.4copy.temptemp2
<chr><dbl><lgl><lgl><dbl><dbl>
1mon22.2TRUENA22.244.4
2tue99999.0TRUENA99999.0199998.0
3wed23.0FALSENA23.046.0
4thu24.3FALSENA24.348.6
# No tomar alguna fila
todo.sin.fila.dos <- df[-2, ]
todo.sin.fila.dos
A data.frame: 5 × 6
col.name.1col.name.2col.name.3col.name.4copy.temptemp2
<chr><dbl><lgl><lgl><dbl><dbl>
1mon22.2TRUENA22.244.4
3wed23.0FALSENA23.046.0
4thu24.3FALSENA24.348.6
5fri25.0TRUENA25.050.0
6satNATRUENANANA
# Seleccion Condicional
sub1 <- df[ (df$col.name.2 > 23 & df$temp2 > 48), ]
sub1
A data.frame: 4 × 6
col.name.1col.name.2col.name.3col.name.4copy.temptemp2
<chr><dbl><lgl><lgl><dbl><dbl>
2tue99999.0TRUENA99999.0199998.0
4thu24.3FALSENA24.348.6
5fri25.0TRUENA25.050.0
NANANANANANANA
# Seleccion Condicional
sub2 <- subset(df, col.name.2 > 23 & temp2 < 100)
sub2
A data.frame: 2 × 6
col.name.1col.name.2col.name.3col.name.4copy.temptemp2
<chr><dbl><lgl><lgl><dbl><dbl>
4thu24.3FALSENA24.348.6
5fri25.0TRUENA25.050.0

Seleccion de varias columnas

# Tomar las columnas 1 2 3
df[, c(1, 2, 3)]
A data.frame: 6 × 3
col.name.1col.name.2col.name.3
<chr><dbl><lgl>
mon22.2TRUE
tue99999.0TRUE
wed23.0FALSE
thu24.3FALSE
fri25.0TRUE
satNATRUE
# Por el nombre
df[, c('col.name.1', 'temp2')]
A data.frame: 6 × 2
col.name.1temp2
<chr><dbl>
mon44.4
tue199998.0
wed46.0
thu48.6
fri50.0
satNA
# Tomar todo menos la primera columna
df[, -1]
A data.frame: 6 × 5
col.name.2col.name.3col.name.4copy.temptemp2
<dbl><lgl><lgl><dbl><dbl>
22.2TRUENA22.244.4
99999.0TRUENA99999.0199998.0
23.0FALSENA23.046.0
24.3FALSENA24.348.6
25.0TRUENA25.050.0
NATRUENANANA
# Tomar todo menos la columna 1 y 3
df[, -c(1, 3)]
A data.frame: 6 × 4
col.name.2col.name.4copy.temptemp2
<dbl><lgl><dbl><dbl>
22.2NA22.244.4
99999.0NA99999.0199998.0
23.0NA23.046.0
24.3NA24.348.6
25.0NA25.050.0
NANANANA

Tratando con datos faltantes

Tratar con los datos que faltan es una habilidad muy importante que debe conocer cuando se trabaja con dataframes. Las celdas con datos faltantes se llenan con el valor na

df2 <- df# hacer una copia del dataframe
df2
A data.frame: 6 × 6
col.name.1col.name.2col.name.3col.name.4copy.temptemp2
<chr><dbl><lgl><lgl><dbl><dbl>
mon22.2TRUENA22.244.4
tue99999.0TRUENA99999.0199998.0
wed23.0FALSENA23.046.0
thu24.3FALSENA24.348.6
fri25.0TRUENA25.050.0
satNATRUENANANA
# detectar si hay algun dato faltante en el dataframa
any(is.na(df2))

TRUE

# Algun dato faltante en la columna buscada
any(is.na(df2$col.name.1))

FALSE

# Algun dato faltante en la columna buscada
any(is.na(df2$col.name.4))

TRUE

# reemplazar NA con algun valor
df2[is.na(df2)] <- 0 # lo hace para todo el dataframe
df2
A data.frame: 6 × 6
col.name.1col.name.2col.name.3col.name.4copy.temptemp2
<chr><dbl><lgl><dbl><dbl><dbl>
mon22.2TRUE022.244.4
tue99999.0TRUE099999.0199998.0
wed23.0FALSE023.046.0
thu24.3FALSE024.348.6
fri25.0TRUE025.050.0
sat0.0TRUE00.00.0
# Para una columna en especifico
df2<-df
df2$col.name.4[is.na(df2$col.name.4)] <- 999
df2
A data.frame: 6 × 6
col.name.1col.name.2col.name.3col.name.4copy.temptemp2
<chr><dbl><lgl><dbl><dbl><dbl>
mon22.2TRUE99922.244.4
tue99999.0TRUE99999999.0199998.0
wed23.0FALSE99923.046.0
thu24.3FALSE99924.348.6
fri25.0TRUE99925.050.0
satNATRUE999NANA
# Borrar las filas que tengan datos faltantes en una columna especifica
df2<-df
df2 <- df2[!is.na(df2$col.name.2),]
df2
A data.frame: 5 × 6
col.name.1col.name.2col.name.3col.name.4copy.temptemp2
<chr><dbl><lgl><lgl><dbl><dbl>
1mon22.2TRUENA22.244.4
2tue99999.0TRUENA99999.0199998.0
3wed23.0FALSENA23.046.0
4thu24.3FALSENA24.348.6
5fri25.0TRUENA25.050.0

Mezclando dataframes merge()

# utilice columnas de caracteres de nombres para obtener un orden de clasificación razonable
authors <- data.frame(
    surname = I(c("Tukey", "Venables", "Tierney", "Ripley", "McNeil")),
    nationality = c("US", "Australia", "US", "UK", "Australia"),
    deceased = c("yes", rep("no", 4)))
authors
A data.frame: 5 × 3
surnamenationalitydeceased
<I<chr>><chr><chr>
TukeyUSyes
VenablesAustraliano
TierneyUSno
RipleyUKno
McNeilAustraliano
books <- data.frame(
    name = I(c("Tukey", "Venables", "Tierney",
             "Ripley", "Ripley", "McNeil", "R Core")),
    title = c("Exploratory Data Analysis",
              "Modern Applied Statistics ...",
              "LISP-STAT",
              "Spatial Statistics", "Stochastic Simulation",
              "Interactive Data Analysis",
              "An Introduction to R"),
    other.author = c(NA, "Ripley", NA, NA, NA, NA,
                     "Venables & Smith"))
books
A data.frame: 7 × 3
nametitleother.author
<I<chr>><chr><chr>
TukeyExploratory Data AnalysisNA
VenablesModern Applied Statistics ...Ripley
TierneyLISP-STATNA
RipleySpatial StatisticsNA
RipleyStochastic SimulationNA
McNeilInteractive Data AnalysisNA
R CoreAn Introduction to RVenables & Smith
# Mezclar authors y books por el nombre
# Observar que estan en columnas diferentes
(m1 <- merge(authors, books, by.x = "surname", by.y = "name"))
A data.frame: 6 × 5
surnamenationalitydeceasedtitleother.author
<I<chr>><chr><chr><chr><chr>
McNeilAustralianoInteractive Data AnalysisNA
RipleyUKnoSpatial StatisticsNA
RipleyUKnoStochastic SimulationNA
TierneyUSnoLISP-STATNA
TukeyUSyesExploratory Data AnalysisNA
VenablesAustralianoModern Applied Statistics ...Ripley
## mezclar todos los valores
merge(authors, books, by.x = "surname", by.y = "name", all = TRUE)
A data.frame: 7 × 5
surnamenationalitydeceasedtitleother.author
<I<chr>><chr><chr><chr><chr>
McNeilAustralianoInteractive Data AnalysisNA
R CoreNANAAn Introduction to RVenables & Smith
RipleyUKnoSpatial StatisticsNA
RipleyUKnoStochastic SimulationNA
TierneyUSnoLISP-STATNA
TukeyUSyesExploratory Data AnalysisNA
VenablesAustralianoModern Applied Statistics ...Ripley
## Ejemplo usando 'incomparables'
x <- data.frame(k1 = c(NA,NA,3,4,5), k2 = c(1,NA,NA,4,5), data = 1:5)
y <- data.frame(k1 = c(NA,2,NA,4,5), k2 = c(NA,NA,3,4,5), data = 1:5)
merge(x, y, by = c("k1","k2")) # NA's se toman como iguales
merge(x, y, by = "k1") # NA's como iguales, tenemos 6 filas
merge(x, y, by = "k2", incomparables = NA) # 2 filas, sin los NA
A data.frame: 3 × 4
k1k2data.xdata.y
<dbl><dbl><int><int>
4444
5555
NANA21
A data.frame: 6 × 5
k1k2.xdata.xk2.ydata.y
<dbl><dbl><int><dbl><int>
44444
55555
NA11NA1
NA1133
NANA2NA1
NANA233
A data.frame: 2 × 5
k2k1.xdata.xk1.ydata.y
<dbl><dbl><int><dbl><int>
44444
55555

Listas en R

Las listas nos permitirán almacenar una variedad de estructuras de datos bajo una sola variable. Esto significa que podríamos almacenar un vector, matriz, dataframe, etc. en una sola lista.

# Crear un vector
v <- c(1,2,3,4,5)

# Crear una matriz
m <- matrix(1:10,nrow=2)

# Crear un dataframe
df <- women
v
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
m
A matrix: 2 × 5 of type int
13579
246810
df
A data.frame: 15 × 2
heightweight
<dbl><dbl>
58115
59117
60120
61123
62126
63129
64132
65135
66139
67142
68146
69150
70154
71159
72164

Funcion list()

Se unsa la funcion list() para combinar todas los datos

li <- list(v,m,df)
li
    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
  1. A matrix: 2 × 5 of type int
    13579
    246810
  2. A data.frame: 15 × 2
    heightweight
    <dbl><dbl>
    58115
    59117
    60120
    61123
    62126
    63129
    64132
    65135
    66139
    67142
    68146
    69150
    70154
    71159
    72164

La lista asigna numeros a cada uno de los objetos de la lista, pero tambein se pueden asignar nombres.

li <- list(sample_vec = v,sample_mat = m, sample_df = df)
li
$sample_vec
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
$sample_mat
A matrix: 2 × 5 of type int
13579
246810
$sample_df
A data.frame: 15 × 2
heightweight
<dbl><dbl>
58115
59117
60120
61123
62126
63129
64132
65135
66139
67142
68146
69150
70154
71159
72164

Seleccionando objetos de una lista

Puede usar la notación de corchetes para mostrar objetos en una lista, y corchetes dobles para realmente agarrar los objetos de la lista

# corchetes simples
li[1] # por index

$sample_vec =

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
# Por nombre
li['sample_vec']

$sample_vec =

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
# Note el tipo de dato
class(li['sample_vec'])

’list’

# Utilice dobles corchetes para realmente obtener los datos
li[['sample_vec']]
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
# tambien se puede usar la notacion $
li$sample_vec
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5

También puede indexar luego despues de que ha seleccionado el objeto de la lista

# Segunda indexacion
li[['sample_vec']][1]

1

li[['sample_mat']]
A matrix: 2 × 5 of type int
13579
246810
li[['sample_mat']][1,]
  1. 1
  2. 3
  3. 5
  4. 7
  5. 9
li[['sample_mat']][1:2,1:2]
A matrix: 2 × 2 of type int
13
24
li[['sample_df']]['height']
A data.frame: 15 × 1
height
<dbl>
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72

Combinacion de listas

Las listas pueden contener otras listas! También puede combinar listas usando la función de combinación c()

double_list <- c(li,li)
double_list
$sample_vec
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
$sample_mat
A matrix: 2 × 5 of type int
13579
246810
$sample_df
A data.frame: 15 × 2
heightweight
<dbl><dbl>
58115
59117
60120
61123
62126
63129
64132
65135
66139
67142
68146
69150
70154
71159
72164
$sample_vec
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
$sample_mat
A matrix: 2 × 5 of type int
13579
246810
$sample_df
A data.frame: 15 × 2
heightweight
<dbl><dbl>
58115
59117
60120
61123
62126
63129
64132
65135
66139
67142
68146
69150
70154
71159
72164
str(double_list)
List of 6
 $ sample_vec: num [1:5] 1 2 3 4 5
 $ sample_mat: int [1:2, 1:5] 1 2 3 4 5 6 7 8 9 10
 $ sample_df :'data.frame': 15 obs. of  2 variables:
  ..$ height: num [1:15] 58 59 60 61 62 63 64 65 66 67 ...
  ..$ weight: num [1:15] 115 117 120 123 126 129 132 135 139 142 ...
 $ sample_vec: num [1:5] 1 2 3 4 5
 $ sample_mat: int [1:2, 1:5] 1 2 3 4 5 6 7 8 9 10
 $ sample_df :'data.frame': 15 obs. of  2 variables:
  ..$ height: num [1:15] 58 59 60 61 62 63 64 65 66 67 ...
  ..$ weight: num [1:15] 115 117 120 123 126 129 132 135 139 142 ...

Programacion en R

Operadores Logicos

Los operadores lógicos nos permitirán combinar múltiples operadores de comparación. Los operadores lógicos de los que aprenderemos son:

  • AND - &
  • OR - |
  • NOT - !
# Declarando la variable
x <- 10
# Menor que
x < 20

TRUE

# Mayor que
x > 5

TRUE

# Combinacion de comparaciones
x < 20 & x > 5

TRUE

# Para mejor entendimiento es mejor usar parentesis
(x < 20) & (x>5)

TRUE

# Combinacion con AND
(x < 20) & (x>5) & (x == 10)

TRUE

#Combinacion con AND
(x==2) & (x > 1)

FALSE

# Combinacion con OR
(x==2) | (x > 1)

TRUE

# Combinacion con OR
(x==1) | (x==12)

FALSE

Negacion (NOT !)

(10==1)

FALSE

!(10==1)

TRUE

# Esto no es comun, pero es posible
!!(10==1)

FALSE

Ejemplo de uso

df <- mtcars
head(df)
A data.frame: 6 × 11
mpgcyldisphpdratwtqsecvsamgearcarb
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl>
Mazda RX421.061601103.902.62016.460144
Mazda RX4 Wag21.061601103.902.87517.020144
Datsun 71022.84108933.852.32018.611141
Hornet 4 Drive21.462581103.083.21519.441031
Hornet Sportabout18.783601753.153.44017.020032
Valiant18.162251052.763.46020.221031
# Carros con mpg mayores o iguales a 20
df[df['mpg'] >= 20,] # Observe el uso de la coma en la indexacion
# subset(df,mpg>=20) # Tambien se puede usar
A data.frame: 14 × 11
mpgcyldisphpdratwtqsecvsamgearcarb
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl>
Mazda RX421.06160.01103.902.62016.460144
Mazda RX4 Wag21.06160.01103.902.87517.020144
Datsun 71022.84108.0933.852.32018.611141
Hornet 4 Drive21.46258.01103.083.21519.441031
Merc 240D24.44146.7623.693.19020.001042
Merc 23022.84140.8953.923.15022.901042
Fiat 12832.4478.7664.082.20019.471141
Honda Civic30.4475.7524.931.61518.521142
Toyota Corolla33.9471.1654.221.83519.901141
Toyota Corona21.54120.1973.702.46520.011031
Fiat X1-927.3479.0664.081.93518.901141
Porsche 914-226.04120.3914.432.14016.700152
Lotus Europa30.4495.11133.771.51316.901152
Volvo 142E21.44121.01094.112.78018.601142

Great! Now let's combine filters with logical operators! Let's grab rows with cars of at least 20mpg and over 100 hp.

# Carros con mpg mayores o iguales a 20 y hp mayor que 100
df[(df['mpg'] >= 20) & (df['hp'] > 100),]
A data.frame: 5 × 11
mpgcyldisphpdratwtqsecvsamgearcarb
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl>
Mazda RX421.06160.01103.902.62016.460144
Mazda RX4 Wag21.06160.01103.902.87517.020144
Hornet 4 Drive21.46258.01103.083.21519.441031
Lotus Europa30.4495.11133.771.51316.901152
Volvo 142E21.44121.01094.112.78018.601142

Operadores Logicos con Vectores

Se realiza elemento a elemento

vector_uno <- c(TRUE,FALSE)
vector_dos <- c(TRUE,TRUE)
vector_tres <- c(FALSE, TRUE)
vector_dos & vector_uno
  1. TRUE
  2. FALSE
vector_dos | vector_uno
  1. TRUE
  2. TRUE

para comparar algun elemento de una posicion en particular del vector

vector_tres[1] & vector_dos[1]

FALSE

vector_dos[1] & vector_uno[1]

TRUE

vector_dos[1] | vector_uno[2]

TRUE

vector_dos[2] | vector_tres[1]

TRUE

Condicionales if, else, else if

Su sintaxis es:

if (condicion) {
    codigo a realizar si es verdadero
    }
else if (condicion){
    codigo a realizar si es verdadero
    }
else{
    codigo a realizar si ninguno de los anteriores es verdadero
    }
hot <- FALSE
temp <- 60
if (temp > 80){
    hot <- TRUE
    }
hot

FALSE

temp <- 100
if (temp > 80){
    hot <- TRUE
    }
hot

TRUE

# Incluyendo el else
temp <- 30

if (temp > 90){
    print("Esta caliente!")
} else{
    print("No esta muy caliente")
}
[1] "No esta muy caliente"

Condicional completo

temp <- 30
if (temp > 80){
    print("Esta caliente")
} else if(temp<80 & temp>50){
    print('Esta tibio!')
} else if(temp <50 & temp > 32){
    print("Esta frio!")
} else{
    print("Esta muy frio!")
}
[1] "Esta muy frio!"

Ciclos For

Su sintaxis es:

for (Varible_temporal in objeto) {
    codigo a realizar en cada iteracion
    }

Para terminar los loops se utiliza la palabra break

Ciclor for sobre un Vector

vec <- c(1,2,3,4,5)
for (temp_var in vec){
    print(temp_var)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
# otra forma de hacerlo es creando los elementos de iteracion
for (i in 1:length(vec)){
    print(vec[i])
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5

Ciclos for sobre una lista

li <- list(1,2,3,4,5)
for (temp_var in li){
    print(temp_var)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
for (i in 1:length(li)){
    print(li[[i]]) # Recuerde usar los corchetes dobles para tomar el valor
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5

Ciclo for en una Matriz

mat <- matrix(1:15,nrow=3)
mat
A matrix: 3 × 5 of type int
1471013
2581114
3691215
for (num in mat){
    print(num)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11
[1] 12
[1] 13
[1] 14
[1] 15

Ciclos Anidados

for (row in 1:nrow(mat)){
    for (col in 1:ncol(mat)){
        print(paste('El elemento de la fila:',row,'y columna:',col,'es',mat[row,col]))
    }
}
[1] "El elemento de la fila: 1 y columna: 1 es 1"
[1] "El elemento de la fila: 1 y columna: 2 es 4"
[1] "El elemento de la fila: 1 y columna: 3 es 7"
[1] "El elemento de la fila: 1 y columna: 4 es 10"
[1] "El elemento de la fila: 1 y columna: 5 es 13"
[1] "El elemento de la fila: 2 y columna: 1 es 2"
[1] "El elemento de la fila: 2 y columna: 2 es 5"
[1] "El elemento de la fila: 2 y columna: 3 es 8"
[1] "El elemento de la fila: 2 y columna: 4 es 11"
[1] "El elemento de la fila: 2 y columna: 5 es 14"
[1] "El elemento de la fila: 3 y columna: 1 es 3"
[1] "El elemento de la fila: 3 y columna: 2 es 6"
[1] "El elemento de la fila: 3 y columna: 3 es 9"
[1] "El elemento de la fila: 3 y columna: 4 es 12"
[1] "El elemento de la fila: 3 y columna: 5 es 15"

Ciclos While

Su sintaxis es:

while (Variable) {
    codigo a realizar mientras la variable sea verdadera
    }
x <- 0
while(x < 10){

    cat('x tiene el valor de: ',x)
    print(' x todavia es menor que 10, sumando 1 a x')
    # Sumar 1 a x
    x <- x+1
}
x tiene el valor de:  0[1] " x todavia es menor que 10, sumando 1 a x"
x tiene el valor de:  1[1] " x todavia es menor que 10, sumando 1 a x"
x tiene el valor de:  2[1] " x todavia es menor que 10, sumando 1 a x"
x tiene el valor de:  3[1] " x todavia es menor que 10, sumando 1 a x"
x tiene el valor de:  4[1] " x todavia es menor que 10, sumando 1 a x"
x tiene el valor de:  5[1] " x todavia es menor que 10, sumando 1 a x"
x tiene el valor de:  6[1] " x todavia es menor que 10, sumando 1 a x"
x tiene el valor de:  7[1] " x todavia es menor que 10, sumando 1 a x"
x tiene el valor de:  8[1] " x todavia es menor que 10, sumando 1 a x"
x tiene el valor de:  9[1] " x todavia es menor que 10, sumando 1 a x"

Funciones

El sintaxis de creacion de una funcion es:

Nombre_funcion <- function(arg1,arg2,...){
         #Codigo que se ejecuta cuando se llama la funcion
    }
# Funcion simple sin entradas
hello <- function(){
    print('hola!')
}
hello()
[1] "hola!"
helloyou <- function(name){
    print(paste('Hola ',name))
}
helloyou('Joe')
[1] "Hola  Joe"
add_num <- function(num1,num2){
    print(num1+num2)
}
add_num(5,10)
[1] 15

Valores predeterminados

hola_persona <- function(name='Juan'){
    print(paste('Hola ',name))
}
# Usando el valor predeterminado
hola_persona()
[1] "Hola  Juan"
#definiendo el argumento de entrada
hola_persona('Matias')
[1] "Hola  Matias"

Retornando Valores

formal <- function(name='Jose',title='Don'){
    return(paste(title,' ',name))
}
formal()

‘Don Jose’

formal('Issac Newton')

‘Don Issac Newton’

var <- formal('Marie Curie','Ms.')
var

‘Ms. Marie Curie’

double <- function(a) {
  a <- 2*a         # esta variable es definida solo para la funcion tiene un scope local
  a
}
var <- 5
double(var)
var

10

5

Funciones Built-in

  • seq(): Crea secuencias
  • sort(): Ordena un vector
  • rev(): Revierte los elementos en un objeto
  • str(): Muestra la estrutura de un objeto
  • append(): Mezcla objetos (Funciona en vectores y listas)
# seq(inicio,final,tamaño del paso)
seq(0, 100, by = 3)
  1. 0
  2. 3
  3. 6
  4. 9
  5. 12
  6. 15
  7. 18
  8. 21
  9. 24
  10. 27
  11. 30
  12. 33
  13. 36
  14. 39
  15. 42
  16. 45
  17. 48
  18. 51
  19. 54
  20. 57
  21. 60
  22. 63
  23. 66
  24. 69
  25. 72
  26. 75
  27. 78
  28. 81
  29. 84
  30. 87
  31. 90
  32. 93
  33. 96
  34. 99
v <- c(1,4,6,7,2,13,2)
sort(v)
  1. 1
  2. 2
  3. 2
  4. 4
  5. 6
  6. 7
  7. 13
sort(v,decreasing = TRUE)
  1. 13
  2. 7
  3. 6
  4. 4
  5. 2
  6. 2
  7. 1
v2 <- c(1,2,3,4,5)
rev(v2)
  1. 5
  2. 4
  3. 3
  4. 2
  5. 1
str(v)
 num [1:7] 1 4 6 7 2 13 2
append(v,v2)
  1. 1
  2. 4
  3. 6
  4. 7
  5. 2
  6. 13
  7. 2
  8. 1
  9. 2
  10. 3
  11. 4
  12. 5
sort(append(v,v2))
  1. 1
  2. 1
  3. 2
  4. 2
  5. 2
  6. 3
  7. 4
  8. 4
  9. 5
  10. 6
  11. 7
  12. 13

Verificar el tipo de datos

  • is.*(): Verificar la clase de un objeto de R
  • as.*(): Convertir objetos de R
v <- c(1,2,3)
is.vector(v)

TRUE

is.list(v)

FALSE

as.list(v)
  1. 1
  2. 2
  3. 3
as.matrix(v)
A matrix: 3 × 1 of type dbl
1
2
3

Funciones Matematicas

R tiene incluidas varias funciones matematicas, por ejemplo:

  • abs(): calcula el valor absoluto
  • sum(): SUma todos los elementos de la entrada
  • mean(): Calcula el promedio
  • round(): aproxima los valores al entero mas cercado
v <- c(-1,0,1,2,3,4,5)
abs(-2)

2

abs(v)
  1. 1
  2. 0
  3. 1
  4. 2
  5. 3
  6. 4
  7. 5
sum(v)

14

mean(v)

2

round(23.1231)

23

round(23.1231234,2)

23.12

Mas Funciones:

FuncionDescripcion
abs(x)valor absoluto
sqrt(x)raiz cuadrada
ceiling(x)ceiling(3.475) es 4
floor(x)floor(3.475) es 3
trunc(x)trunc(5.99) es 5
round(x, digits=n)round(3.475, digits=2) es 3.48
signif(x, digits=n)signif(3.475, digits=2) es 3.5
cos(x), sin(x), tan(x)tambien acos(x), cosh(x), acosh(x), etc.
log(x)logaritmo natural
log10(x)logaritmo base 10
exp(x)e^x

Funciones Apply

La idea basica es que apply() aplica una funcion sobre un objeto que es iterable.

lapply()

Aplica una funcion sobre una lista o un vector. lapply(X, FUN, ...) X puede ser una lista o un vector y FUN es la funcion que quiere aplicar

help(lapply)
# seleccionar un solo numero aleatorio entre 1 y 10
sample(x = 1:10,1)

7

# vector
v <- c(1,2,3,4,5)

# funcion inventada
addrand <- function(x){
    # obtener un numero aleatorio
    ran <-sample(x=1:10,1)

    # devuelve x + el numero aleatorio
    return(x+ran)
}

# lapply()
lapply(v,addrand)
  1. 11
  2. 5
  3. 13
  4. 5
  5. 8

Funciones Anonimas

No es necesario declarar toda la funcion, si es una funcion simple se puede crear para el momento que se necesita. (Es la idea similar a las expresiones Lambda en Python)

v
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
# Vamos a hacer lo mismo que con el ejemplo de lapply()
# Funcion Anonima con lapply()
lapply(v, function(a){a+sample(x=1:10,1)})
  1. 3
  2. 3
  3. 9
  4. 6
  5. 11
# Otro Ejemplo
# Suma 2 a cada elemento
lapply(v,function(x){x+2})
  1. 3
  2. 4
  3. 5
  4. 6
  5. 7

Con funciones con varios argumentos?

add_choice <- function(num,choice){
    return(num+choice)
}
add_choice(2,3)

5

lapply(v,add_choice,choice=10)
  1. 11
  2. 12
  3. 13
  4. 14
  5. 15

Se pueden seguir poniendo argumentos sin problema.

sapply() vs. lapply()

lapply devuelve una lista, sapply devuelve un vector o una matrix

help(sapply)
# Devuelve un vector
sapply(v,add_choice,choice=10)
  1. 11
  2. 12
  3. 13
  4. 14
  5. 15
# Vamos a probarlo
lapp <- lapply(v,add_choice,choice=10)
sapp <- sapply(v,add_choice,choice=10)

class(lapp) # Una lista
class(sapp) # Un vector de numeros

’list’

’numeric’

Limitaciones de sapply()

sapply() no podrá devolver automáticamente un vector si la función aplicada no devuelve algo para todos los elementos en ese vector.

# Verifica los numeros pares
even <- function(x) {
  return(x[(x %% 2 == 0)])
}

nums <- c(1,2,3,4,5)

sapply(nums,even) #devulelve una lista
  1. 2
  2. 4
lapply(nums,even)
  1. 2
  2. 4

Expresiones Regulares

Es un término general que cubre la idea de búsqueda de patrones, generalmente en un string (o un vector de strings).

  • grepl() que devuelve un valor lógico que indica si se encontró el patrón
  • grep() que devuelve un vector de ubicaciones de índice de instancias de patrón coincidentes.

Para mas informacion lo puede hcaer en http://www.regular-expressions.info/rlanguage.html Para ambas funciones, pasará un patrón y luego el objeto que desea buscar. Veamos algunos ejemplos rápidos:

text <- "Los datos son el nuevo petroleo en el siglo XXI"
grepl('datos',text)

TRUE

grepl('nuevo',text)

TRUE

grepl('Jose',text)

FALSE

v <- c('a','b','c','d')
grep('a',v)

1

grep('c',v)

3


Timestamps

R nos brinda una variedad de herramientas para trabajar con información de tiempo.

Date

Puede usar la función as.Date() para convertir una cadena de caracteres en un objeto Date, lo que le permitirá contener más información de tiempo. El string deberá estar en un formato de hora estándar. Podemos solicitar la fecha de hoy preguntando al sistema (Sys) por la Fecha:

Sys.Date()

# Guardarlo en una variable
today <- Sys.Date()
today

También puede convertir cadenas de caracteres en R a un objeto Date usando as.Date(). Deberá asegurarse de que esté en el formato correcto o usar% símbolos correlacionados con su formato dado:

CodeValue
%dDay of the month (decimal number)
%mMonth (decimal number)
%bMonth (abbreviated)
%BMonth (full name)
%yYear (2 digit)
%YYear (4 digit)
# YYYY-MM-DD
as.Date('1990-11-03')

# Usando format
as.Date("Nov-03-90",format="%b-%d-%y")

# Usando format
as.Date("November-03-1990",format="%B-%d-%Y")

Time

Convierte un string en un tipo de datos de tiempo, la funcion es strptime()

help(strptime)
strptime("11:02:03",format="%H:%M:%S")
[1] "2024-06-27 11:02:03 UTC"

Leer y guardar Datos (Data Input and Output)

CSV File (comma-separated values)

# Poner todo el path completo
ex <- read.csv('/content/sample_data/california_housing_test.csv')
# Verificar la estructura
str(ex)
'data.frame': 3000 obs. of  9 variables:
 $ longitude         : num  -122 -118 -118 -118 -120 ...
 $ latitude          : num  37.4 34.3 33.8 33.8 36.3 ...
 $ housing_median_age: num  27 43 27 28 19 37 43 19 15 31 ...
 $ total_rooms       : num  3885 1510 3589 67 1241 ...
 $ total_bedrooms    : num  661 310 507 15 244 213 225 471 617 632 ...
 $ population        : num  1537 809 1484 49 850 ...
 $ households        : num  606 277 495 11 237 204 218 441 599 603 ...
 $ median_income     : num  6.61 3.6 5.79 6.14 2.94 ...
 $ median_house_value: num  344700 176500 270500 330000 81700 ...
# Nombres de las columnas
colnames(ex)
  1. 'longitude'
  2. 'latitude'
  3. 'housing_median_age'
  4. 'total_rooms'
  5. 'total_bedrooms'
  6. 'population'
  7. 'households'
  8. 'median_income'
  9. 'median_house_value'
df <- data.frame(ex)
head(df)
A data.frame: 6 × 9
longitudelatitudehousing_median_agetotal_roomstotal_bedroomspopulationhouseholdsmedian_incomemedian_house_value
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl>
1-122.0537.3727388566115376066.6085344700
2-118.3034.264315103108092773.5990176500
3-117.8133.7827358950714844955.7934270500
4-118.3633.8228671549116.1359330000
5-119.6736.331912412448502372.937581700
6-119.5636.513710182136632041.663567000
# tambein se puede utilizar si el archivo tiene otro tipo de caracter de separacion
help(read.csv)

read.table()

Es la forma general de utilizar read.csv()

Es necesario agregar argumentos adicionales del delimitador o separador (sep)a read.table, para evitar un error:

california = read.table(file = '/content/sample_data/california_housing_test.csv', sep = ',')
head(california)
A data.frame: 6 × 9
V1V2V3V4V5V6V7V8V9
<chr><chr><chr><chr><chr><chr><chr><chr><chr>
1longitudelatitudehousing_median_agetotal_roomstotal_bedroomspopulationhouseholdsmedian_incomemedian_house_value
2-122.05000037.37000027.0000003885.000000661.0000001537.000000606.0000006.608500344700.000000
3-118.30000034.26000043.0000001510.000000310.000000809.000000277.0000003.599000176500.000000
4-117.81000033.78000027.0000003589.000000507.0000001484.000000495.0000005.793400270500.000000
5-118.36000033.82000028.00000067.00000015.00000049.00000011.0000006.135900330000.000000
6-119.67000036.33000019.0000001241.000000244.000000850.000000237.0000002.93750081700.000000

Grabar a csv

### Alternatively
write.csv(df, file = "foo.csv")
foo = read.csv('foo.csv')
head(foo)
A data.frame: 6 × 10
Xlongitudelatitudehousing_median_agetotal_roomstotal_bedroomspopulationhouseholdsmedian_incomemedian_house_value
<int><dbl><dbl><int><int><int><int><int><dbl><dbl>
11-122.0537.3727388566115376066.6085344700
22-118.3034.264315103108092773.5990176500
33-117.8133.7827358950714844955.7934270500
44-118.3633.8228671549116.1359330000
55-119.6736.331912412448502372.937581700
66-119.5636.513710182136632041.663567000
#Sin los nombres de las filas
write.csv(df, file = "foo2.csv",row.names = FALSE)
foo2 = read.csv('foo2.csv')
head(foo2)
A data.frame: 6 × 9
longitudelatitudehousing_median_agetotal_roomstotal_bedroomspopulationhouseholdsmedian_incomemedian_house_value
<dbl><dbl><int><int><int><int><int><dbl><dbl>
1-122.0537.3727388566115376066.6085344700
2-118.3034.264315103108092773.5990176500
3-117.8133.7827358950714844955.7934270500
4-118.3633.8228671549116.1359330000
5-119.6736.331912412448502372.937581700
6-119.5636.513710182136632041.663567000

Excel

Nota rápida: el archivo de Excel utilizado tiene una gran cantidad de valores de NA, así es el archivo,

Para hacer esto, necesitamos el paquete readxl para R. Recuerde que puede descargarlo usando:

install.packages('readxl')

# si no tiene el paquete readxl se debe instalar
# install.packages('readxl')
# Load the readxl package
library(readxl)
# Descargar archivo de url
system("wget https://fragilestatesindex.org/wp-content/uploads/2023/06/FSI-2023-DOWNLOAD.xlsx")
# list the sheets of the excel file
excel_sheets('FSI-2023-DOWNLOAD.xlsx')

‘Sheet1’

# tomar la informacion de la hoa 1 sheet1
df <- read_excel('FSI-2023-DOWNLOAD.xlsx',sheet='Sheet1')
head(df)
A tibble: 6 × 16
CountryYearRankTotalS1: Demographic PressuresS2: Refugees and IDPsC3: Group GrievanceE3: Human Flight and Brain DrainE2: Economic InequalityE1: EconomyP1: State LegitimacyP2: Public ServicesP3: Human RightsC1: Security ApparatusC2: Factionalized ElitesX1: External Intervention
<chr><dbl><chr><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl>
Somalia20231st111.910.09.08.78.69.19.59.69.89.09.510.09.1
Yemen20232nd108.99.69.68.86.47.99.99.89.69.68.69.99.2
South Sudan20233rd108.59.710.08.66.58.68.69.89.78.79.99.29.2
Congo Democratic Republic20234th107.29.79.89.46.48.48.19.39.39.38.89.69.1
Syria20235th107.17.49.19.18.06.59.610.09.09.19.49.910.0
Afghanistan20236th106.69.28.68.38.58.29.69.410.08.79.78.77.7

Ahora se puede trabajar normalmente con el dataframe

sum(df['Total'])

11784

str(df)
tibble [179 × 16] (S3: tbl_df/tbl/data.frame)
 $ Country                         : chr [1:179] "Somalia" "Yemen" "South Sudan" "Congo Democratic Republic" ...
 $ Year                            : num [1:179] 2023 2023 2023 2023 2023 ...
 $ Rank                            : chr [1:179] "1st" "2nd" "3rd" "4th" ...
 $ Total                           : num [1:179] 112 109 109 107 107 ...
 $ S1: Demographic Pressures       : num [1:179] 10 9.6 9.7 9.7 7.4 9.2 8.8 9.3 9.5 8.8 ...
 $ S2: Refugees and IDPs           : num [1:179] 9 9.6 10 9.8 9.1 8.6 9.6 9.5 9 7.7 ...
 $ C3: Group Grievance             : num [1:179] 8.7 8.8 8.6 9.4 9.1 8.3 9.3 8.1 8.1 5.5 ...
 $ E3: Human Flight and Brain Drain: num [1:179] 8.6 6.4 6.5 6.4 8 8.5 7.5 6.2 7.7 8.3 ...
 $ E2: Economic Inequality         : num [1:179] 9.1 7.9 8.6 8.4 6.5 8.2 8.5 9.6 8.7 9.2 ...
 $ E1: Economy                     : num [1:179] 9.5 9.9 8.6 8.1 9.6 9.6 9.3 8.2 8.4 8.9 ...
 $ P1: State Legitimacy            : num [1:179] 9.6 9.8 9.8 9.3 10 9.4 9.4 8.9 9.1 9.9 ...
 $ P2: Public Services             : num [1:179] 9.8 9.6 9.7 9.3 9 10 8.6 10 9.6 9.8 ...
 $ P3: Human Rights                : num [1:179] 9 9.6 8.7 9.3 9.1 8.7 9.2 9.1 8.4 8.7 ...
 $ C1: Security Apparatus          : num [1:179] 9.5 8.6 9.9 8.8 9.4 9.7 8.3 8 8.7 6.8 ...
 $ C2: Factionalized Elites        : num [1:179] 10 9.9 9.2 9.6 9.9 8.7 9.6 9.4 9.5 9.7 ...
 $ X1: External Intervention       : num [1:179] 9.1 9.2 9.2 9.1 10 7.7 8.1 9.4 7.9 9.6 ...
summary(df)
   Country               Year          Rank               Total
 Length:179         Min.   :2023   Length:179         Min.   : 14.50
 Class :character   1st Qu.:2023   Class :character   1st Qu.: 49.00
 Mode  :character   Median :2023   Mode  :character   Median : 68.20
                    Mean   :2023                      Mean   : 65.83
                    3rd Qu.:2023                      3rd Qu.: 82.20
                    Max.   :2023                      Max.   :111.90
 S1: Demographic Pressures S2: Refugees and IDPs C3: Group Grievance
 Min.   : 1.100            Min.   : 0.500        Min.   :0.300
 1st Qu.: 4.100            1st Qu.: 2.800        1st Qu.:3.600
 Median : 5.900            Median : 4.500        Median :5.500
 Mean   : 5.956            Mean   : 4.764        Mean   :5.575
 3rd Qu.: 8.050            3rd Qu.: 6.450        3rd Qu.:7.550
 Max.   :10.000            Max.   :10.000        Max.   :9.700
 E3: Human Flight and Brain Drain E2: Economic Inequality  E1: Economy
 Min.   : 0.400                   Min.   :1.400           Min.   :1.000
 1st Qu.: 3.700                   1st Qu.:3.650           1st Qu.:4.100
 Median : 5.600                   Median :5.200           Median :6.000
 Mean   : 5.184                   Mean   :5.323           Mean   :5.687
 3rd Qu.: 6.600                   3rd Qu.:7.200           3rd Qu.:7.150
 Max.   :10.000                   Max.   :9.600           Max.   :9.900
 P1: State Legitimacy P2: Public Services P3: Human Rights
 Min.   : 0.300       Min.   : 0.900      Min.   :0.400
 1st Qu.: 3.650       1st Qu.: 3.450      1st Qu.:3.600
 Median : 6.400       Median : 5.100      Median :5.700
 Mean   : 5.741       Mean   : 5.459      Mean   :5.437
 3rd Qu.: 8.100       3rd Qu.: 7.950      3rd Qu.:7.500
 Max.   :10.000       Max.   :10.000      Max.   :9.900
 C1: Security Apparatus C2: Factionalized Elites X1: External Intervention
 Min.   : 0.300         Min.   : 1.000           Min.   : 0.300
 1st Qu.: 3.350         1st Qu.: 4.950           1st Qu.: 3.150
 Median : 5.100         Median : 7.200           Median : 5.300
 Mean   : 5.015         Mean   : 6.618           Mean   : 5.072
 3rd Qu.: 6.700         3rd Qu.: 8.550           3rd Qu.: 7.000
 Max.   :10.000         Max.   :10.000           Max.   :10.000

SQL EN R

La conexión de R a una base de datos SQL depende completamente del tipo de base de datos que esté utilizando (MYSQL, Oracle, etc.).

Entonces, en lugar de tratar de cubrir todos estos (ya que cada uno requiere un

RODBC

La libreria RODBC

MySQL

Libreria “RMySQL

Oracle

Libreria ROracle

Referencias