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
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()
- 'bank.account'
- 'c'
- 'char'
- 'deposit'
- 'DirTrabajo'
- 'f'
- 'i'
- 'n'
- 't'
- 'variable.name'
# Borrar una variable del workspace
rm(deposit)
ls()
- 'bank.account'
- 'c'
- 'char'
- 'DirTrabajo'
- 'f'
- 'i'
- 'n'
- 't'
- '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
- TRUE
- 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
- 0
- 2
class(v)
’numeric'
v <- c('A',1)
v
- 'A'
- '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
- 72
- 71
- 68
- 73
- 69
- 75
- 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
- 6
- 8
- 10
Resta de Vectores
v1-v1
- 0
- 0
- 0
v1-v2
- -4
- -4
- -4
Multiplicacion de Vectores
v1*v2
- 5
- 12
- 21
Division de vectores
v1/v2
- 0.2
- 0.333333333333333
- 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
- 2
- 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
- 100
- 200
- 300
- 'a'
- 'b'
- '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
- 100
- 200
v2[c(2,3)] # tomar el elemento 2 y 3
- 'b'
- 'c'
v2[c(1,3)] # tomar el elemento 1 y 3
- 'a'
- '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
- 2
- 3
- 4
v[7:10]
- 7
- 8
- 9
- 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
- TRUE
- TRUE
- 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
- TRUE
- FALSE
- FALSE
- FALSE
- FALSE
v == 3
- FALSE
- FALSE
- TRUE
- FALSE
- 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
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
v <- 1:10
v
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 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
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)
1 | 3 | 5 | 7 | 9 |
2 | 4 | 6 | 8 | 10 |
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)
1 | 5 | 9 |
2 | 6 | 10 |
3 | 7 | 11 |
4 | 8 | 12 |
matrix(1:12, byrow=TRUE, nrow=4)
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
10 | 11 | 12 |
v
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 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
450 | 451 | 452 | 445 | 468 |
230 | 231 | 232 | 236 | 228 |
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
Mon | Tue | Wed | Thu | Fri | |
---|---|---|---|---|---|
GOOG | 450 | 451 | 452 | 445 | 468 |
MSFT | 230 | 231 | 232 | 236 | 228 |
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
1 | 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 |
31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 |
41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 |
# Multiplicacion
2*mat
2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 | 20 |
22 | 24 | 26 | 28 | 30 | 32 | 34 | 36 | 38 | 40 |
42 | 44 | 46 | 48 | 50 | 52 | 54 | 56 | 58 | 60 |
62 | 64 | 66 | 68 | 70 | 72 | 74 | 76 | 78 | 80 |
82 | 84 | 86 | 88 | 90 | 92 | 94 | 96 | 98 | 100 |
# Division
1/mat
1.00000000 | 0.50000000 | 0.33333333 | 0.25000000 | 0.20000000 | 0.16666667 | 0.14285714 | 0.12500000 | 0.11111111 | 0.10000000 |
0.09090909 | 0.08333333 | 0.07692308 | 0.07142857 | 0.06666667 | 0.06250000 | 0.05882353 | 0.05555556 | 0.05263158 | 0.05000000 |
0.04761905 | 0.04545455 | 0.04347826 | 0.04166667 | 0.04000000 | 0.03846154 | 0.03703704 | 0.03571429 | 0.03448276 | 0.03333333 |
0.03225806 | 0.03125000 | 0.03030303 | 0.02941176 | 0.02857143 | 0.02777778 | 0.02702703 | 0.02631579 | 0.02564103 | 0.02500000 |
0.02439024 | 0.02380952 | 0.02325581 | 0.02272727 | 0.02222222 | 0.02173913 | 0.02127660 | 0.02083333 | 0.02040816 | 0.02000000 |
# Division
mat/2
0.5 | 1 | 1.5 | 2 | 2.5 | 3 | 3.5 | 4 | 4.5 | 5 |
5.5 | 6 | 6.5 | 7 | 7.5 | 8 | 8.5 | 9 | 9.5 | 10 |
10.5 | 11 | 11.5 | 12 | 12.5 | 13 | 13.5 | 14 | 14.5 | 15 |
15.5 | 16 | 16.5 | 17 | 17.5 | 18 | 18.5 | 19 | 19.5 | 20 |
20.5 | 21 | 21.5 | 22 | 22.5 | 23 | 23.5 | 24 | 24.5 | 25 |
# Potencia
mat ^ 2
1 | 4 | 9 | 16 | 25 | 36 | 49 | 64 | 81 | 100 |
121 | 144 | 169 | 196 | 225 | 256 | 289 | 324 | 361 | 400 |
441 | 484 | 529 | 576 | 625 | 676 | 729 | 784 | 841 | 900 |
961 | 1024 | 1089 | 1156 | 1225 | 1296 | 1369 | 1444 | 1521 | 1600 |
1681 | 1764 | 1849 | 1936 | 2025 | 2116 | 2209 | 2304 | 2401 | 2500 |
Operadores de comparacion con Matrices
mat > 17
FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE |
FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | FALSE | TRUE | TRUE | TRUE |
TRUE | TRUE | TRUE | TRUE | TRUE | TRUE | TRUE | TRUE | TRUE | TRUE |
TRUE | TRUE | TRUE | TRUE | TRUE | TRUE | TRUE | TRUE | TRUE | TRUE |
TRUE | TRUE | TRUE | TRUE | TRUE | TRUE | TRUE | TRUE | TRUE | TRUE |
Aritmetica con matrices
Elemento a elemento
mat + mat
2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 | 20 |
22 | 24 | 26 | 28 | 30 | 32 | 34 | 36 | 38 | 40 |
42 | 44 | 46 | 48 | 50 | 52 | 54 | 56 | 58 | 60 |
62 | 64 | 66 | 68 | 70 | 72 | 74 | 76 | 78 | 80 |
82 | 84 | 86 | 88 | 90 | 92 | 94 | 96 | 98 | 100 |
mat / mat
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
#Cuidado, puede dar numeros grandes
mat ^ mat
1.000000e+00 | 4.000000e+00 | 2.700000e+01 | 2.560000e+02 | 3.125000e+03 | 4.665600e+04 | 8.235430e+05 | 1.677722e+07 | 3.874205e+08 | 1.000000e+10 |
2.853117e+11 | 8.916100e+12 | 3.028751e+14 | 1.111201e+16 | 4.378939e+17 | 1.844674e+19 | 8.272403e+20 | 3.934641e+22 | 1.978420e+24 | 1.048576e+26 |
5.842587e+27 | 3.414279e+29 | 2.088047e+31 | 1.333736e+33 | 8.881784e+34 | 6.156120e+36 | 4.434265e+38 | 3.314552e+40 | 2.567686e+42 | 2.058911e+44 |
1.706917e+46 | 1.461502e+48 | 1.291100e+50 | 1.175664e+52 | 1.102507e+54 | 1.063874e+56 | 1.055513e+58 | 1.075912e+60 | 1.125951e+62 | 1.208926e+64 |
1.330878e+66 | 1.501309e+68 | 1.734377e+70 | 2.050774e+72 | 2.480636e+74 | 3.068035e+76 | 3.877924e+78 | 5.007021e+80 | 6.600972e+82 | 8.881784e+84 |
mat*mat
1 | 4 | 9 | 16 | 25 | 36 | 49 | 64 | 81 | 100 |
121 | 144 | 169 | 196 | 225 | 256 | 289 | 324 | 361 | 400 |
441 | 484 | 529 | 576 | 625 | 676 | 729 | 784 | 841 | 900 |
961 | 1024 | 1089 | 1156 | 1225 | 1296 | 1369 | 1444 | 1521 | 1600 |
1681 | 1764 | 1849 | 1936 | 2025 | 2116 | 2209 | 2304 | 2401 | 2500 |
Multiplicación de Matrices
mat2 <- matrix(1:9, nrow=3)
mat2
1 | 4 | 7 |
2 | 5 | 8 |
3 | 6 | 9 |
# Verdadera Multiplicacion de Matrices
mat2 %*% mat2
30 | 66 | 102 |
36 | 81 | 126 |
42 | 96 | 150 |
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
Mon | Tue | Wed | Thu | Fri | |
---|---|---|---|---|---|
GOOG | 450 | 451 | 452 | 445 | 468 |
MSFT | 230 | 231 | 232 | 236 | 228 |
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
Mon | Tue | Wed | Thu | Fri | |
---|---|---|---|---|---|
GOOG | 450 | 451 | 452 | 445 | 468 |
MSFT | 230 | 231 | 232 | 236 | 228 |
FB | 111 | 112 | 113 | 120 | 145 |
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
Mon | Tue | Wed | Thu | Fri | avg | |
---|---|---|---|---|---|---|
GOOG | 450 | 451 | 452 | 445 | 468 | 453.2 |
MSFT | 230 | 231 | 232 | 236 | 228 | 231.4 |
FB | 111 | 112 | 113 | 120 | 145 | 120.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
1 | 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 |
31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 |
41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 |
# Tomar la primera fila
mat[1,]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
# Tomarla primera columna
mat[,1]
- 1
- 11
- 21
- 31
- 41
# Tomar las primeras 3 filas
mat[1:3,]
1 | 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 |
# Tomar diferente numero de filas y columnas
# 1,2,3
# 11,12,13
#
mat[1:2,1:3]
1 | 2 | 3 |
11 | 12 | 13 |
#Tomar las dos ultimas columnas
mat[,9:10]
9 | 10 |
19 | 20 |
29 | 30 |
39 | 40 |
49 | 50 |
# Tomar los valores centrales
# 15,16
# 25,26
mat[2:3,5:6]
15 | 16 |
25 | 26 |
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
- d
- c
- d
- c
- c
Levels:
- 'c'
- '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
- frio
- tibio
- frio
- tibio
- caliente
- caliente
- frio
Levels:
- 'frio'
- 'tibio'
- '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
Population | Income | Illiteracy | Life Exp | Murder | HS Grad | Frost | Area | |
---|---|---|---|---|---|---|---|---|
Alabama | 3615 | 3624 | 2.1 | 69.05 | 15.1 | 41.3 | 20 | 50708 |
Alaska | 365 | 6315 | 1.5 | 69.31 | 11.3 | 66.7 | 152 | 566432 |
Arizona | 2212 | 4530 | 1.8 | 70.55 | 7.8 | 58.1 | 15 | 113417 |
Arkansas | 2110 | 3378 | 1.9 | 70.66 | 10.1 | 39.9 | 65 | 51945 |
California | 21198 | 5114 | 1.1 | 71.71 | 10.3 | 62.6 | 20 | 156361 |
Colorado | 2541 | 4884 | 0.7 | 72.06 | 6.8 | 63.9 | 166 | 103766 |
Connecticut | 3100 | 5348 | 1.1 | 72.48 | 3.1 | 56.0 | 139 | 4862 |
Delaware | 579 | 4809 | 0.9 | 70.06 | 6.2 | 54.6 | 103 | 1982 |
Florida | 8277 | 4815 | 1.3 | 70.66 | 10.7 | 52.6 | 11 | 54090 |
Georgia | 4931 | 4091 | 2.0 | 68.54 | 13.9 | 40.6 | 60 | 58073 |
Hawaii | 868 | 4963 | 1.9 | 73.60 | 6.2 | 61.9 | 0 | 6425 |
Idaho | 813 | 4119 | 0.6 | 71.87 | 5.3 | 59.5 | 126 | 82677 |
Illinois | 11197 | 5107 | 0.9 | 70.14 | 10.3 | 52.6 | 127 | 55748 |
Indiana | 5313 | 4458 | 0.7 | 70.88 | 7.1 | 52.9 | 122 | 36097 |
Iowa | 2861 | 4628 | 0.5 | 72.56 | 2.3 | 59.0 | 140 | 55941 |
Kansas | 2280 | 4669 | 0.6 | 72.58 | 4.5 | 59.9 | 114 | 81787 |
Kentucky | 3387 | 3712 | 1.6 | 70.10 | 10.6 | 38.5 | 95 | 39650 |
Louisiana | 3806 | 3545 | 2.8 | 68.76 | 13.2 | 42.2 | 12 | 44930 |
Maine | 1058 | 3694 | 0.7 | 70.39 | 2.7 | 54.7 | 161 | 30920 |
Maryland | 4122 | 5299 | 0.9 | 70.22 | 8.5 | 52.3 | 101 | 9891 |
Massachusetts | 5814 | 4755 | 1.1 | 71.83 | 3.3 | 58.5 | 103 | 7826 |
Michigan | 9111 | 4751 | 0.9 | 70.63 | 11.1 | 52.8 | 125 | 56817 |
Minnesota | 3921 | 4675 | 0.6 | 72.96 | 2.3 | 57.6 | 160 | 79289 |
Mississippi | 2341 | 3098 | 2.4 | 68.09 | 12.5 | 41.0 | 50 | 47296 |
Missouri | 4767 | 4254 | 0.8 | 70.69 | 9.3 | 48.8 | 108 | 68995 |
Montana | 746 | 4347 | 0.6 | 70.56 | 5.0 | 59.2 | 155 | 145587 |
Nebraska | 1544 | 4508 | 0.6 | 72.60 | 2.9 | 59.3 | 139 | 76483 |
Nevada | 590 | 5149 | 0.5 | 69.03 | 11.5 | 65.2 | 188 | 109889 |
New Hampshire | 812 | 4281 | 0.7 | 71.23 | 3.3 | 57.6 | 174 | 9027 |
New Jersey | 7333 | 5237 | 1.1 | 70.93 | 5.2 | 52.5 | 115 | 7521 |
New Mexico | 1144 | 3601 | 2.2 | 70.32 | 9.7 | 55.2 | 120 | 121412 |
New York | 18076 | 4903 | 1.4 | 70.55 | 10.9 | 52.7 | 82 | 47831 |
North Carolina | 5441 | 3875 | 1.8 | 69.21 | 11.1 | 38.5 | 80 | 48798 |
North Dakota | 637 | 5087 | 0.8 | 72.78 | 1.4 | 50.3 | 186 | 69273 |
Ohio | 10735 | 4561 | 0.8 | 70.82 | 7.4 | 53.2 | 124 | 40975 |
Oklahoma | 2715 | 3983 | 1.1 | 71.42 | 6.4 | 51.6 | 82 | 68782 |
Oregon | 2284 | 4660 | 0.6 | 72.13 | 4.2 | 60.0 | 44 | 96184 |
Pennsylvania | 11860 | 4449 | 1.0 | 70.43 | 6.1 | 50.2 | 126 | 44966 |
Rhode Island | 931 | 4558 | 1.3 | 71.90 | 2.4 | 46.4 | 127 | 1049 |
South Carolina | 2816 | 3635 | 2.3 | 67.96 | 11.6 | 37.8 | 65 | 30225 |
South Dakota | 681 | 4167 | 0.5 | 72.08 | 1.7 | 53.3 | 172 | 75955 |
Tennessee | 4173 | 3821 | 1.7 | 70.11 | 11.0 | 41.8 | 70 | 41328 |
Texas | 12237 | 4188 | 2.2 | 70.90 | 12.2 | 47.4 | 35 | 262134 |
Utah | 1203 | 4022 | 0.6 | 72.90 | 4.5 | 67.3 | 137 | 82096 |
Vermont | 472 | 3907 | 0.6 | 71.64 | 5.5 | 57.1 | 168 | 9267 |
Virginia | 4981 | 4701 | 1.4 | 70.08 | 9.5 | 47.8 | 85 | 39780 |
Washington | 3559 | 4864 | 0.6 | 71.72 | 4.3 | 63.5 | 32 | 66570 |
West Virginia | 1799 | 3617 | 1.4 | 69.48 | 6.7 | 41.6 | 100 | 24070 |
Wisconsin | 4589 | 4468 | 0.7 | 72.48 | 3.0 | 54.5 | 149 | 54464 |
Wyoming | 376 | 4566 | 0.6 | 70.29 | 6.9 | 62.9 | 173 | 97203 |
# Gastos personales en US
USPersonalExpenditure
1940 | 1945 | 1950 | 1955 | 1960 | |
---|---|---|---|---|---|
Food and Tobacco | 22.200 | 44.500 | 59.60 | 73.2 | 86.80 |
Household Operation | 10.500 | 15.500 | 29.00 | 36.5 | 46.20 |
Medical and Health | 3.530 | 5.760 | 9.71 | 14.0 | 21.10 |
Personal Care | 1.040 | 1.980 | 2.45 | 3.4 | 5.40 |
Private Education | 0.341 | 0.974 | 1.80 | 2.6 | 3.64 |
# Mujeres
women
height | weight |
---|---|
<dbl> | <dbl> |
58 | 115 |
59 | 117 |
60 | 120 |
61 | 123 |
62 | 126 |
63 | 129 |
64 | 132 |
65 | 135 |
66 | 139 |
67 | 142 |
68 | 146 |
69 | 150 |
70 | 154 |
71 | 159 |
72 | 164 |
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
Population | Income | Illiteracy | Life Exp | Murder | HS Grad | Frost | Area | |
---|---|---|---|---|---|---|---|---|
Alabama | 3615 | 3624 | 2.1 | 69.05 | 15.1 | 41.3 | 20 | 50708 |
Alaska | 365 | 6315 | 1.5 | 69.31 | 11.3 | 66.7 | 152 | 566432 |
Arizona | 2212 | 4530 | 1.8 | 70.55 | 7.8 | 58.1 | 15 | 113417 |
Arkansas | 2110 | 3378 | 1.9 | 70.66 | 10.1 | 39.9 | 65 | 51945 |
California | 21198 | 5114 | 1.1 | 71.71 | 10.3 | 62.6 | 20 | 156361 |
Colorado | 2541 | 4884 | 0.7 | 72.06 | 6.8 | 63.9 | 166 | 103766 |
tail(states) #ultimas 6 filas
Population | Income | Illiteracy | Life Exp | Murder | HS Grad | Frost | Area | |
---|---|---|---|---|---|---|---|---|
Vermont | 472 | 3907 | 0.6 | 71.64 | 5.5 | 57.1 | 168 | 9267 |
Virginia | 4981 | 4701 | 1.4 | 70.08 | 9.5 | 47.8 | 85 | 39780 |
Washington | 3559 | 4864 | 0.6 | 71.72 | 4.3 | 63.5 | 32 | 66570 |
West Virginia | 1799 | 3617 | 1.4 | 69.48 | 6.7 | 41.6 | 100 | 24070 |
Wisconsin | 4589 | 4468 | 0.7 | 72.48 | 3.0 | 54.5 | 149 | 54464 |
Wyoming | 376 | 4566 | 0.6 | 70.29 | 6.9 | 62.9 | 173 | 97203 |
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
col.name.1 | col.name.2 |
---|---|
<int> | <chr> |
1 | a |
2 | b |
3 | c |
4 | d |
5 | e |
6 | f |
7 | g |
8 | h |
9 | i |
10 | j |
# 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
days | temp | rain |
---|---|---|
<chr> | <dbl> | <lgl> |
mon | 22.2 | TRUE |
tue | 21.0 | TRUE |
wed | 23.0 | FALSE |
thu | 24.3 | FALSE |
fri | 25.0 | TRUE |
# 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,]
days | temp | rain | |
---|---|---|---|
<chr> | <dbl> | <lgl> | |
1 | mon | 22.2 | TRUE |
# Toda la columna 1
df[,1]
- 'mon'
- 'tue'
- 'wed'
- 'thu'
- 'fri'
# Tomar los datos del viernes
df[5,]
days | temp | rain | |
---|---|---|---|
<chr> | <dbl> | <lgl> | |
5 | fri | 25 | TRUE |
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']
- TRUE
- TRUE
- FALSE
- FALSE
- TRUE
# Primeas 5 filas de las columnas days y temp
df[1:5,c('days','temp')]
days | temp | |
---|---|---|
<chr> | <dbl> | |
1 | mon | 22.2 |
2 | tue | 21.0 |
3 | wed | 23.0 |
4 | thu | 24.3 |
5 | fri | 25.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
- TRUE
- TRUE
- FALSE
- FALSE
- TRUE
df$days
- 'mon'
- 'tue'
- 'wed'
- 'thu'
- 'fri'
También puede usar la notación de corchetes para devolver un dataframe con la misma información:
df['rain']
rain |
---|
<lgl> |
TRUE |
TRUE |
FALSE |
FALSE |
TRUE |
df['days']
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)
days | temp | rain | |
---|---|---|---|
<chr> | <dbl> | <lgl> | |
1 | mon | 22.2 | TRUE |
2 | tue | 21.0 | TRUE |
5 | fri | 25.0 | TRUE |
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)
days | temp | rain | |
---|---|---|---|
<chr> | <dbl> | <lgl> | |
4 | thu | 24.3 | FALSE |
5 | fri | 25.0 | TRUE |
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,]
days | temp | rain | |
---|---|---|---|
<chr> | <dbl> | <lgl> | |
2 | tue | 21.0 | TRUE |
1 | mon | 22.2 | TRUE |
3 | wed | 23.0 | FALSE |
4 | thu | 24.3 | FALSE |
5 | fri | 25.0 | TRUE |
Observemos en realidad de que tipo es sorted.temp:
sorted.temp
- 2
- 1
- 3
- 4
- 5
# Orden descendente poniendo el signo negativo
desc.temp <- order(-df$temp)
df[desc.temp,]
days | temp | rain | |
---|---|---|---|
<chr> | <dbl> | <lgl> | |
5 | fri | 25.0 | TRUE |
4 | thu | 24.3 | FALSE |
3 | wed | 23.0 | FALSE |
1 | mon | 22.2 | TRUE |
2 | tue | 21.0 | TRUE |
Informacion de filas y columnas
# Numero de Filas y Columnas
nrow(df)
ncol(df)
5
3
# Nombres de las columnas
colnames(df)
- 'days'
- 'temp'
- 'rain'
# Nombre de las filas (En este dataframe son numeros)
rownames(df)
- '1'
- '2'
- '3'
- '4'
- '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
days | temp | |
---|---|---|
<chr> | <dbl> | |
1 | mon | 22.2 |
2 | tue | 21.0 |
3 | wed | 23.0 |
df[[2, 'temp']] <- 99999 # reasignando el valor en una celda
df
days | temp | rain |
---|---|---|
<chr> | <dbl> | <lgl> |
mon | 22.2 | TRUE |
tue | 99999.0 | TRUE |
wed | 23.0 | FALSE |
thu | 24.3 | FALSE |
fri | 25.0 | TRUE |
Referenciando filas
# Retorna un dataframe (No un vector)
rowdf <- df[1, ]
rowdf
days | temp | rain | |
---|---|---|---|
<chr> | <dbl> | <lgl> | |
1 | mon | 22.2 | TRUE |
#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”
- <NA>
- 22.2
- 1
Referenciando Columnas
La mayoria de referencias de columna retornan un vector
# dataset de carros
cars <- mtcars
head(cars)
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|
<dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | |
Mazda RX4 | 21.0 | 6 | 160 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
Mazda RX4 Wag | 21.0 | 6 | 160 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
Datsun 710 | 22.8 | 4 | 108 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
Hornet 4 Drive | 21.4 | 6 | 258 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
Hornet Sportabout | 18.7 | 8 | 360 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 |
Valiant | 18.1 | 6 | 225 | 105 | 2.76 | 3.460 | 20.22 | 1 | 0 | 3 | 1 |
colv1 <- cars$mpg # retorna un vector
colv1
- 21
- 21
- 22.8
- 21.4
- 18.7
- 18.1
- 14.3
- 24.4
- 22.8
- 19.2
- 17.8
- 16.4
- 17.3
- 15.2
- 10.4
- 10.4
- 14.7
- 32.4
- 30.4
- 33.9
- 21.5
- 15.5
- 15.2
- 13.3
- 19.2
- 27.3
- 26
- 30.4
- 15.8
- 19.7
- 15
- 21.4
colv2 <- cars[, 'mpg'] # retorna un vector
colv2
- 21
- 21
- 22.8
- 21.4
- 18.7
- 18.1
- 14.3
- 24.4
- 22.8
- 19.2
- 17.8
- 16.4
- 17.3
- 15.2
- 10.4
- 10.4
- 14.7
- 32.4
- 30.4
- 33.9
- 21.5
- 15.5
- 15.2
- 13.3
- 19.2
- 27.3
- 26
- 30.4
- 15.8
- 19.7
- 15
- 21.4
colv3<- cars[, 1] # son int o string?
colv3
- 21
- 21
- 22.8
- 21.4
- 18.7
- 18.1
- 14.3
- 24.4
- 22.8
- 19.2
- 17.8
- 16.4
- 17.3
- 15.2
- 10.4
- 10.4
- 14.7
- 32.4
- 30.4
- 33.9
- 21.5
- 15.5
- 15.2
- 13.3
- 19.2
- 27.3
- 26
- 30.4
- 15.8
- 19.7
- 15
- 21.4
colv4 <- cars[['mpg']] # retorna un vector
colv4
- 21
- 21
- 22.8
- 21.4
- 18.7
- 18.1
- 14.3
- 24.4
- 22.8
- 19.2
- 17.8
- 16.4
- 17.3
- 15.2
- 10.4
- 10.4
- 14.7
- 32.4
- 30.4
- 33.9
- 21.5
- 15.5
- 15.2
- 13.3
- 19.2
- 27.3
- 26
- 30.4
- 15.8
- 19.7
- 15
- 21.4
Para retornar dataframes puederser asi:
mpgdf <- cars['mpg'] # retorna un dataframe de 1 col
head(mpgdf)
mpg | |
---|---|
<dbl> | |
Mazda RX4 | 21.0 |
Mazda RX4 Wag | 21.0 |
Datsun 710 | 22.8 |
Hornet 4 Drive | 21.4 |
Hornet Sportabout | 18.7 |
Valiant | 18.1 |
mpgdf2 <- cars[1] # retorna un dataframe de 1 col
head(mpgdf2)
mpg | |
---|---|
<dbl> | |
Mazda RX4 | 21.0 |
Mazda RX4 Wag | 21.0 |
Datsun 710 | 22.8 |
Hornet 4 Drive | 21.4 |
Hornet Sportabout | 18.7 |
Valiant | 18.1 |
Agregando Filas rbind()
df
days | temp | rain |
---|---|---|
<chr> | <dbl> | <lgl> |
mon | 22.2 | TRUE |
tue | 99999.0 | TRUE |
wed | 23.0 | FALSE |
thu | 24.3 | FALSE |
fri | 25.0 | TRUE |
# Los dos argumentos son dataframes
df2 <- data.frame(days = "sat", temp = NA ,rain = TRUE )
df2
days | temp | rain |
---|---|---|
<chr> | <lgl> | <lgl> |
sat | NA | TRUE |
# usar rbind para agregar una nueva fila
df <- rbind(df,df2)
df
days | temp | rain |
---|---|---|
<chr> | <dbl> | <lgl> |
mon | 22.2 | TRUE |
tue | 99999.0 | TRUE |
wed | 23.0 | FALSE |
thu | 24.3 | FALSE |
fri | 25.0 | TRUE |
sat | NA | TRUE |
Agregando Columnas cbind()
# crear una columna convalores NA
df$newcol <- rep(NA, nrow(df))
df
days | temp | rain | newcol |
---|---|---|---|
<chr> | <dbl> | <lgl> | <lgl> |
mon | 22.2 | TRUE | NA |
tue | 99999.0 | TRUE | NA |
wed | 23.0 | FALSE | NA |
thu | 24.3 | FALSE | NA |
fri | 25.0 | TRUE | NA |
sat | NA | TRUE | NA |
# Copiar una columna
df[, 'copy.of.temp'] <- df$temp
df
days | temp | rain | newcol | copy.of.temp |
---|---|---|---|---|
<chr> | <dbl> | <lgl> | <lgl> | <dbl> |
mon | 22.2 | TRUE | NA | 22.2 |
tue | 99999.0 | TRUE | NA | 99999.0 |
wed | 23.0 | FALSE | NA | 23.0 |
thu | 24.3 | FALSE | NA | 24.3 |
fri | 25.0 | TRUE | NA | 25.0 |
sat | NA | TRUE | NA | NA |
# tambien se pueden usar ecuaciones
df[['temp.times.2']] <- df$temp * 2
df
days | temp | rain | newcol | copy.of.temp | temp.times.2 |
---|---|---|---|---|---|
<chr> | <dbl> | <lgl> | <lgl> | <dbl> | <dbl> |
mon | 22.2 | TRUE | NA | 22.2 | 44.4 |
tue | 99999.0 | TRUE | NA | 99999.0 | 199998.0 |
wed | 23.0 | FALSE | NA | 23.0 | 46.0 |
thu | 24.3 | FALSE | NA | 24.3 | 48.6 |
fri | 25.0 | TRUE | NA | 25.0 | 50.0 |
sat | NA | TRUE | NA | NA | NA |
# Usando la funcion cbind()
df3 <- cbind(df, df$temp)
df3
days | temp | rain | newcol | copy.of.temp | temp.times.2 | df$temp |
---|---|---|---|---|---|---|
<chr> | <dbl> | <lgl> | <lgl> | <dbl> | <dbl> | <dbl> |
mon | 22.2 | TRUE | NA | 22.2 | 44.4 | 22.2 |
tue | 99999.0 | TRUE | NA | 99999.0 | 199998.0 | 99999.0 |
wed | 23.0 | FALSE | NA | 23.0 | 46.0 | 23.0 |
thu | 24.3 | FALSE | NA | 24.3 | 48.6 | 24.3 |
fri | 25.0 | TRUE | NA | 25.0 | 50.0 | 25.0 |
sat | NA | TRUE | NA | NA | NA | NA |
Definir el Nombre de las Columnas
# Renombrar unacolumna
colnames(df)[5] <- 'copia.Temperatura'
df
days | temp | rain | newcol | copia.Temperatura | temp.times.2 |
---|---|---|---|---|---|
<chr> | <dbl> | <lgl> | <lgl> | <dbl> | <dbl> |
mon | 22.2 | TRUE | NA | 22.2 | 44.4 |
tue | 99999.0 | TRUE | NA | 99999.0 | 199998.0 |
wed | 23.0 | FALSE | NA | 23.0 | 46.0 |
thu | 24.3 | FALSE | NA | 24.3 | 48.6 |
fri | 25.0 | TRUE | NA | 25.0 | 50.0 |
sat | NA | TRUE | NA | NA | NA |
# Renombrar todas con un vector
colnames(df) <- c('col.name.1', 'col.name.2', 'col.name.3', 'col.name.4' ,'copy.temp','temp2')
df
col.name.1 | col.name.2 | col.name.3 | col.name.4 | copy.temp | temp2 |
---|---|---|---|---|---|
<chr> | <dbl> | <lgl> | <lgl> | <dbl> | <dbl> |
mon | 22.2 | TRUE | NA | 22.2 | 44.4 |
tue | 99999.0 | TRUE | NA | 99999.0 | 199998.0 |
wed | 23.0 | FALSE | NA | 23.0 | 46.0 |
thu | 24.3 | FALSE | NA | 24.3 | 48.6 |
fri | 25.0 | TRUE | NA | 25.0 | 50.0 |
sat | NA | TRUE | NA | NA | NA |
Seleccion de varias Filas
# Seleccionar solo algunas filas
primeras.cuatro.filas <- df[1:4, ] # Lo mismo que head(df, 4)
primeras.cuatro.filas
col.name.1 | col.name.2 | col.name.3 | col.name.4 | copy.temp | temp2 | |
---|---|---|---|---|---|---|
<chr> | <dbl> | <lgl> | <lgl> | <dbl> | <dbl> | |
1 | mon | 22.2 | TRUE | NA | 22.2 | 44.4 |
2 | tue | 99999.0 | TRUE | NA | 99999.0 | 199998.0 |
3 | wed | 23.0 | FALSE | NA | 23.0 | 46.0 |
4 | thu | 24.3 | FALSE | NA | 24.3 | 48.6 |
# No tomar alguna fila
todo.sin.fila.dos <- df[-2, ]
todo.sin.fila.dos
col.name.1 | col.name.2 | col.name.3 | col.name.4 | copy.temp | temp2 | |
---|---|---|---|---|---|---|
<chr> | <dbl> | <lgl> | <lgl> | <dbl> | <dbl> | |
1 | mon | 22.2 | TRUE | NA | 22.2 | 44.4 |
3 | wed | 23.0 | FALSE | NA | 23.0 | 46.0 |
4 | thu | 24.3 | FALSE | NA | 24.3 | 48.6 |
5 | fri | 25.0 | TRUE | NA | 25.0 | 50.0 |
6 | sat | NA | TRUE | NA | NA | NA |
# Seleccion Condicional
sub1 <- df[ (df$col.name.2 > 23 & df$temp2 > 48), ]
sub1
col.name.1 | col.name.2 | col.name.3 | col.name.4 | copy.temp | temp2 | |
---|---|---|---|---|---|---|
<chr> | <dbl> | <lgl> | <lgl> | <dbl> | <dbl> | |
2 | tue | 99999.0 | TRUE | NA | 99999.0 | 199998.0 |
4 | thu | 24.3 | FALSE | NA | 24.3 | 48.6 |
5 | fri | 25.0 | TRUE | NA | 25.0 | 50.0 |
NA | NA | NA | NA | NA | NA | NA |
# Seleccion Condicional
sub2 <- subset(df, col.name.2 > 23 & temp2 < 100)
sub2
col.name.1 | col.name.2 | col.name.3 | col.name.4 | copy.temp | temp2 | |
---|---|---|---|---|---|---|
<chr> | <dbl> | <lgl> | <lgl> | <dbl> | <dbl> | |
4 | thu | 24.3 | FALSE | NA | 24.3 | 48.6 |
5 | fri | 25.0 | TRUE | NA | 25.0 | 50.0 |
Seleccion de varias columnas
# Tomar las columnas 1 2 3
df[, c(1, 2, 3)]
col.name.1 | col.name.2 | col.name.3 |
---|---|---|
<chr> | <dbl> | <lgl> |
mon | 22.2 | TRUE |
tue | 99999.0 | TRUE |
wed | 23.0 | FALSE |
thu | 24.3 | FALSE |
fri | 25.0 | TRUE |
sat | NA | TRUE |
# Por el nombre
df[, c('col.name.1', 'temp2')]
col.name.1 | temp2 |
---|---|
<chr> | <dbl> |
mon | 44.4 |
tue | 199998.0 |
wed | 46.0 |
thu | 48.6 |
fri | 50.0 |
sat | NA |
# Tomar todo menos la primera columna
df[, -1]
col.name.2 | col.name.3 | col.name.4 | copy.temp | temp2 |
---|---|---|---|---|
<dbl> | <lgl> | <lgl> | <dbl> | <dbl> |
22.2 | TRUE | NA | 22.2 | 44.4 |
99999.0 | TRUE | NA | 99999.0 | 199998.0 |
23.0 | FALSE | NA | 23.0 | 46.0 |
24.3 | FALSE | NA | 24.3 | 48.6 |
25.0 | TRUE | NA | 25.0 | 50.0 |
NA | TRUE | NA | NA | NA |
# Tomar todo menos la columna 1 y 3
df[, -c(1, 3)]
col.name.2 | col.name.4 | copy.temp | temp2 |
---|---|---|---|
<dbl> | <lgl> | <dbl> | <dbl> |
22.2 | NA | 22.2 | 44.4 |
99999.0 | NA | 99999.0 | 199998.0 |
23.0 | NA | 23.0 | 46.0 |
24.3 | NA | 24.3 | 48.6 |
25.0 | NA | 25.0 | 50.0 |
NA | NA | NA | NA |
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
col.name.1 | col.name.2 | col.name.3 | col.name.4 | copy.temp | temp2 |
---|---|---|---|---|---|
<chr> | <dbl> | <lgl> | <lgl> | <dbl> | <dbl> |
mon | 22.2 | TRUE | NA | 22.2 | 44.4 |
tue | 99999.0 | TRUE | NA | 99999.0 | 199998.0 |
wed | 23.0 | FALSE | NA | 23.0 | 46.0 |
thu | 24.3 | FALSE | NA | 24.3 | 48.6 |
fri | 25.0 | TRUE | NA | 25.0 | 50.0 |
sat | NA | TRUE | NA | NA | NA |
# 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
col.name.1 | col.name.2 | col.name.3 | col.name.4 | copy.temp | temp2 |
---|---|---|---|---|---|
<chr> | <dbl> | <lgl> | <dbl> | <dbl> | <dbl> |
mon | 22.2 | TRUE | 0 | 22.2 | 44.4 |
tue | 99999.0 | TRUE | 0 | 99999.0 | 199998.0 |
wed | 23.0 | FALSE | 0 | 23.0 | 46.0 |
thu | 24.3 | FALSE | 0 | 24.3 | 48.6 |
fri | 25.0 | TRUE | 0 | 25.0 | 50.0 |
sat | 0.0 | TRUE | 0 | 0.0 | 0.0 |
# Para una columna en especifico
df2<-df
df2$col.name.4[is.na(df2$col.name.4)] <- 999
df2
col.name.1 | col.name.2 | col.name.3 | col.name.4 | copy.temp | temp2 |
---|---|---|---|---|---|
<chr> | <dbl> | <lgl> | <dbl> | <dbl> | <dbl> |
mon | 22.2 | TRUE | 999 | 22.2 | 44.4 |
tue | 99999.0 | TRUE | 999 | 99999.0 | 199998.0 |
wed | 23.0 | FALSE | 999 | 23.0 | 46.0 |
thu | 24.3 | FALSE | 999 | 24.3 | 48.6 |
fri | 25.0 | TRUE | 999 | 25.0 | 50.0 |
sat | NA | TRUE | 999 | NA | NA |
# Borrar las filas que tengan datos faltantes en una columna especifica
df2<-df
df2 <- df2[!is.na(df2$col.name.2),]
df2
col.name.1 | col.name.2 | col.name.3 | col.name.4 | copy.temp | temp2 | |
---|---|---|---|---|---|---|
<chr> | <dbl> | <lgl> | <lgl> | <dbl> | <dbl> | |
1 | mon | 22.2 | TRUE | NA | 22.2 | 44.4 |
2 | tue | 99999.0 | TRUE | NA | 99999.0 | 199998.0 |
3 | wed | 23.0 | FALSE | NA | 23.0 | 46.0 |
4 | thu | 24.3 | FALSE | NA | 24.3 | 48.6 |
5 | fri | 25.0 | TRUE | NA | 25.0 | 50.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
surname | nationality | deceased |
---|---|---|
<I<chr>> | <chr> | <chr> |
Tukey | US | yes |
Venables | Australia | no |
Tierney | US | no |
Ripley | UK | no |
McNeil | Australia | no |
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
name | title | other.author |
---|---|---|
<I<chr>> | <chr> | <chr> |
Tukey | Exploratory Data Analysis | NA |
Venables | Modern Applied Statistics ... | Ripley |
Tierney | LISP-STAT | NA |
Ripley | Spatial Statistics | NA |
Ripley | Stochastic Simulation | NA |
McNeil | Interactive Data Analysis | NA |
R Core | An Introduction to R | Venables & Smith |
# Mezclar authors y books por el nombre
# Observar que estan en columnas diferentes
(m1 <- merge(authors, books, by.x = "surname", by.y = "name"))
surname | nationality | deceased | title | other.author |
---|---|---|---|---|
<I<chr>> | <chr> | <chr> | <chr> | <chr> |
McNeil | Australia | no | Interactive Data Analysis | NA |
Ripley | UK | no | Spatial Statistics | NA |
Ripley | UK | no | Stochastic Simulation | NA |
Tierney | US | no | LISP-STAT | NA |
Tukey | US | yes | Exploratory Data Analysis | NA |
Venables | Australia | no | Modern Applied Statistics ... | Ripley |
## mezclar todos los valores
merge(authors, books, by.x = "surname", by.y = "name", all = TRUE)
surname | nationality | deceased | title | other.author |
---|---|---|---|---|
<I<chr>> | <chr> | <chr> | <chr> | <chr> |
McNeil | Australia | no | Interactive Data Analysis | NA |
R Core | NA | NA | An Introduction to R | Venables & Smith |
Ripley | UK | no | Spatial Statistics | NA |
Ripley | UK | no | Stochastic Simulation | NA |
Tierney | US | no | LISP-STAT | NA |
Tukey | US | yes | Exploratory Data Analysis | NA |
Venables | Australia | no | Modern 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
k1 | k2 | data.x | data.y |
---|---|---|---|
<dbl> | <dbl> | <int> | <int> |
4 | 4 | 4 | 4 |
5 | 5 | 5 | 5 |
NA | NA | 2 | 1 |
k1 | k2.x | data.x | k2.y | data.y |
---|---|---|---|---|
<dbl> | <dbl> | <int> | <dbl> | <int> |
4 | 4 | 4 | 4 | 4 |
5 | 5 | 5 | 5 | 5 |
NA | 1 | 1 | NA | 1 |
NA | 1 | 1 | 3 | 3 |
NA | NA | 2 | NA | 1 |
NA | NA | 2 | 3 | 3 |
k2 | k1.x | data.x | k1.y | data.y |
---|---|---|---|---|
<dbl> | <dbl> | <int> | <dbl> | <int> |
4 | 4 | 4 | 4 | 4 |
5 | 5 | 5 | 5 | 5 |
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
- 2
- 3
- 4
- 5
m
1 | 3 | 5 | 7 | 9 |
2 | 4 | 6 | 8 | 10 |
df
height | weight |
---|---|
<dbl> | <dbl> |
58 | 115 |
59 | 117 |
60 | 120 |
61 | 123 |
62 | 126 |
63 | 129 |
64 | 132 |
65 | 135 |
66 | 139 |
67 | 142 |
68 | 146 |
69 | 150 |
70 | 154 |
71 | 159 |
72 | 164 |
Funcion list()
Se unsa la funcion list()
para combinar todas los datos
li <- list(v,m,df)
li
- 1
- 2
- 3
- 4
- 5
A matrix: 2 × 5 of type int 1 3 5 7 9 2 4 6 8 10 A data.frame: 15 × 2 height weight <dbl> <dbl> 58 115 59 117 60 120 61 123 62 126 63 129 64 132 65 135 66 139 67 142 68 146 69 150 70 154 71 159 72 164
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
- 2
- 3
- 4
- 5
- $sample_mat
A matrix: 2 × 5 of type int 1 3 5 7 9 2 4 6 8 10 - $sample_df
A data.frame: 15 × 2 height weight <dbl> <dbl> 58 115 59 117 60 120 61 123 62 126 63 129 64 132 65 135 66 139 67 142 68 146 69 150 70 154 71 159 72 164
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
- 2
- 3
- 4
- 5
# Por nombre
li['sample_vec']
$sample_vec =
- 1
- 2
- 3
- 4
- 5
# Note el tipo de dato
class(li['sample_vec'])
’list’
# Utilice dobles corchetes para realmente obtener los datos
li[['sample_vec']]
- 1
- 2
- 3
- 4
- 5
# tambien se puede usar la notacion $
li$sample_vec
- 1
- 2
- 3
- 4
- 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']]
1 | 3 | 5 | 7 | 9 |
2 | 4 | 6 | 8 | 10 |
li[['sample_mat']][1,]
- 1
- 3
- 5
- 7
- 9
li[['sample_mat']][1:2,1:2]
1 | 3 |
2 | 4 |
li[['sample_df']]['height']
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
- 2
- 3
- 4
- 5
- $sample_mat
A matrix: 2 × 5 of type int 1 3 5 7 9 2 4 6 8 10 - $sample_df
A data.frame: 15 × 2 height weight <dbl> <dbl> 58 115 59 117 60 120 61 123 62 126 63 129 64 132 65 135 66 139 67 142 68 146 69 150 70 154 71 159 72 164 - $sample_vec
- 1
- 2
- 3
- 4
- 5
- $sample_mat
A matrix: 2 × 5 of type int 1 3 5 7 9 2 4 6 8 10 - $sample_df
A data.frame: 15 × 2 height weight <dbl> <dbl> 58 115 59 117 60 120 61 123 62 126 63 129 64 132 65 135 66 139 67 142 68 146 69 150 70 154 71 159 72 164
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)
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|
<dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | |
Mazda RX4 | 21.0 | 6 | 160 | 110 | 3.90 | 2.620 | 16.46 | 0 | 1 | 4 | 4 |
Mazda RX4 Wag | 21.0 | 6 | 160 | 110 | 3.90 | 2.875 | 17.02 | 0 | 1 | 4 | 4 |
Datsun 710 | 22.8 | 4 | 108 | 93 | 3.85 | 2.320 | 18.61 | 1 | 1 | 4 | 1 |
Hornet 4 Drive | 21.4 | 6 | 258 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
Hornet Sportabout | 18.7 | 8 | 360 | 175 | 3.15 | 3.440 | 17.02 | 0 | 0 | 3 | 2 |
Valiant | 18.1 | 6 | 225 | 105 | 2.76 | 3.460 | 20.22 | 1 | 0 | 3 | 1 |
# 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
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|
<dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | |
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 |
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 |
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 |
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 |
Volvo 142E | 21.4 | 4 | 121.0 | 109 | 4.11 | 2.780 | 18.60 | 1 | 1 | 4 | 2 |
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),]
mpg | cyl | disp | hp | drat | wt | qsec | vs | am | gear | carb | |
---|---|---|---|---|---|---|---|---|---|---|---|
<dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | |
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 |
Hornet 4 Drive | 21.4 | 6 | 258.0 | 110 | 3.08 | 3.215 | 19.44 | 1 | 0 | 3 | 1 |
Lotus Europa | 30.4 | 4 | 95.1 | 113 | 3.77 | 1.513 | 16.90 | 1 | 1 | 5 | 2 |
Volvo 142E | 21.4 | 4 | 121.0 | 109 | 4.11 | 2.780 | 18.60 | 1 | 1 | 4 | 2 |
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
- TRUE
- FALSE
vector_dos | vector_uno
- TRUE
- 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
1 | 4 | 7 | 10 | 13 |
2 | 5 | 8 | 11 | 14 |
3 | 6 | 9 | 12 | 15 |
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 secuenciassort()
: Ordena un vectorrev()
: Revierte los elementos en un objetostr()
: Muestra la estrutura de un objetoappend()
: Mezcla objetos (Funciona en vectores y listas)
# seq(inicio,final,tamaño del paso)
seq(0, 100, by = 3)
- 0
- 3
- 6
- 9
- 12
- 15
- 18
- 21
- 24
- 27
- 30
- 33
- 36
- 39
- 42
- 45
- 48
- 51
- 54
- 57
- 60
- 63
- 66
- 69
- 72
- 75
- 78
- 81
- 84
- 87
- 90
- 93
- 96
- 99
v <- c(1,4,6,7,2,13,2)
sort(v)
- 1
- 2
- 2
- 4
- 6
- 7
- 13
sort(v,decreasing = TRUE)
- 13
- 7
- 6
- 4
- 2
- 2
- 1
v2 <- c(1,2,3,4,5)
rev(v2)
- 5
- 4
- 3
- 2
- 1
str(v)
num [1:7] 1 4 6 7 2 13 2
append(v,v2)
- 1
- 4
- 6
- 7
- 2
- 13
- 2
- 1
- 2
- 3
- 4
- 5
sort(append(v,v2))
- 1
- 1
- 2
- 2
- 2
- 3
- 4
- 4
- 5
- 6
- 7
- 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
- 2
- 3
as.matrix(v)
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
- 0
- 1
- 2
- 3
- 4
- 5
sum(v)
14
mean(v)
2
round(23.1231)
23
round(23.1231234,2)
23.12
Mas Funciones:
Funcion | Descripcion |
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)
- 11
- 5
- 13
- 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
- 2
- 3
- 4
- 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)})
- 3
- 3
- 9
- 6
- 11
# Otro Ejemplo
# Suma 2 a cada elemento
lapply(v,function(x){x+2})
- 3
- 4
- 5
- 6
- 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)
- 11
- 12
- 13
- 14
- 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)
- 11
- 12
- 13
- 14
- 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
- 2
- 4
lapply(nums,even)
- 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óngrep()
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:
Code | Value |
%d | Day of the month (decimal number) |
%m | Month (decimal number) |
%b | Month (abbreviated) |
%B | Month (full name) |
%y | Year (2 digit) |
%Y | Year (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)
- 'longitude'
- 'latitude'
- 'housing_median_age'
- 'total_rooms'
- 'total_bedrooms'
- 'population'
- 'households'
- 'median_income'
- 'median_house_value'
df <- data.frame(ex)
head(df)
longitude | latitude | housing_median_age | total_rooms | total_bedrooms | population | households | median_income | median_house_value | |
---|---|---|---|---|---|---|---|---|---|
<dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | |
1 | -122.05 | 37.37 | 27 | 3885 | 661 | 1537 | 606 | 6.6085 | 344700 |
2 | -118.30 | 34.26 | 43 | 1510 | 310 | 809 | 277 | 3.5990 | 176500 |
3 | -117.81 | 33.78 | 27 | 3589 | 507 | 1484 | 495 | 5.7934 | 270500 |
4 | -118.36 | 33.82 | 28 | 67 | 15 | 49 | 11 | 6.1359 | 330000 |
5 | -119.67 | 36.33 | 19 | 1241 | 244 | 850 | 237 | 2.9375 | 81700 |
6 | -119.56 | 36.51 | 37 | 1018 | 213 | 663 | 204 | 1.6635 | 67000 |
# 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)
V1 | V2 | V3 | V4 | V5 | V6 | V7 | V8 | V9 | |
---|---|---|---|---|---|---|---|---|---|
<chr> | <chr> | <chr> | <chr> | <chr> | <chr> | <chr> | <chr> | <chr> | |
1 | longitude | latitude | housing_median_age | total_rooms | total_bedrooms | population | households | median_income | median_house_value |
2 | -122.050000 | 37.370000 | 27.000000 | 3885.000000 | 661.000000 | 1537.000000 | 606.000000 | 6.608500 | 344700.000000 |
3 | -118.300000 | 34.260000 | 43.000000 | 1510.000000 | 310.000000 | 809.000000 | 277.000000 | 3.599000 | 176500.000000 |
4 | -117.810000 | 33.780000 | 27.000000 | 3589.000000 | 507.000000 | 1484.000000 | 495.000000 | 5.793400 | 270500.000000 |
5 | -118.360000 | 33.820000 | 28.000000 | 67.000000 | 15.000000 | 49.000000 | 11.000000 | 6.135900 | 330000.000000 |
6 | -119.670000 | 36.330000 | 19.000000 | 1241.000000 | 244.000000 | 850.000000 | 237.000000 | 2.937500 | 81700.000000 |
Grabar a csv
### Alternatively
write.csv(df, file = "foo.csv")
foo = read.csv('foo.csv')
head(foo)
X | longitude | latitude | housing_median_age | total_rooms | total_bedrooms | population | households | median_income | median_house_value | |
---|---|---|---|---|---|---|---|---|---|---|
<int> | <dbl> | <dbl> | <int> | <int> | <int> | <int> | <int> | <dbl> | <dbl> | |
1 | 1 | -122.05 | 37.37 | 27 | 3885 | 661 | 1537 | 606 | 6.6085 | 344700 |
2 | 2 | -118.30 | 34.26 | 43 | 1510 | 310 | 809 | 277 | 3.5990 | 176500 |
3 | 3 | -117.81 | 33.78 | 27 | 3589 | 507 | 1484 | 495 | 5.7934 | 270500 |
4 | 4 | -118.36 | 33.82 | 28 | 67 | 15 | 49 | 11 | 6.1359 | 330000 |
5 | 5 | -119.67 | 36.33 | 19 | 1241 | 244 | 850 | 237 | 2.9375 | 81700 |
6 | 6 | -119.56 | 36.51 | 37 | 1018 | 213 | 663 | 204 | 1.6635 | 67000 |
#Sin los nombres de las filas
write.csv(df, file = "foo2.csv",row.names = FALSE)
foo2 = read.csv('foo2.csv')
head(foo2)
longitude | latitude | housing_median_age | total_rooms | total_bedrooms | population | households | median_income | median_house_value | |
---|---|---|---|---|---|---|---|---|---|
<dbl> | <dbl> | <int> | <int> | <int> | <int> | <int> | <dbl> | <dbl> | |
1 | -122.05 | 37.37 | 27 | 3885 | 661 | 1537 | 606 | 6.6085 | 344700 |
2 | -118.30 | 34.26 | 43 | 1510 | 310 | 809 | 277 | 3.5990 | 176500 |
3 | -117.81 | 33.78 | 27 | 3589 | 507 | 1484 | 495 | 5.7934 | 270500 |
4 | -118.36 | 33.82 | 28 | 67 | 15 | 49 | 11 | 6.1359 | 330000 |
5 | -119.67 | 36.33 | 19 | 1241 | 244 | 850 | 237 | 2.9375 | 81700 |
6 | -119.56 | 36.51 | 37 | 1018 | 213 | 663 | 204 | 1.6635 | 67000 |
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)
Country | Year | Rank | Total | S1: Demographic Pressures | S2: Refugees and IDPs | C3: Group Grievance | E3: Human Flight and Brain Drain | E2: Economic Inequality | E1: Economy | P1: State Legitimacy | P2: Public Services | P3: Human Rights | C1: Security Apparatus | C2: Factionalized Elites | X1: External Intervention |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
<chr> | <dbl> | <chr> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> |
Somalia | 2023 | 1st | 111.9 | 10.0 | 9.0 | 8.7 | 8.6 | 9.1 | 9.5 | 9.6 | 9.8 | 9.0 | 9.5 | 10.0 | 9.1 |
Yemen | 2023 | 2nd | 108.9 | 9.6 | 9.6 | 8.8 | 6.4 | 7.9 | 9.9 | 9.8 | 9.6 | 9.6 | 8.6 | 9.9 | 9.2 |
South Sudan | 2023 | 3rd | 108.5 | 9.7 | 10.0 | 8.6 | 6.5 | 8.6 | 8.6 | 9.8 | 9.7 | 8.7 | 9.9 | 9.2 | 9.2 |
Congo Democratic Republic | 2023 | 4th | 107.2 | 9.7 | 9.8 | 9.4 | 6.4 | 8.4 | 8.1 | 9.3 | 9.3 | 9.3 | 8.8 | 9.6 | 9.1 |
Syria | 2023 | 5th | 107.1 | 7.4 | 9.1 | 9.1 | 8.0 | 6.5 | 9.6 | 10.0 | 9.0 | 9.1 | 9.4 | 9.9 | 10.0 |
Afghanistan | 2023 | 6th | 106.6 | 9.2 | 8.6 | 8.3 | 8.5 | 8.2 | 9.6 | 9.4 | 10.0 | 8.7 | 9.7 | 8.7 | 7.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