R: Tipos y estructuras de datos

Dr. Francisco Zambrano

2024-08-19

Contenidos

  1. Sintaxis de R
  2. Tipos de datos básicos: numeric, character, logical
  3. Estructuras de datos básicos: vector
  4. Tipos de datos derivados: factor, faltantes, date, time
  5. Estructuras de datos básicos: matrix, data.frame

0. Antes de partir

Algunos consejos

  • R es quizas el más poderoso ambiente computacional para análisis de datos.

  • Con R puedes:

    • leer y guardar archivos,
    • manipular y resumir datos
    • correr modelos y test estadísticos
    • crear elegantes gráficos
    • y mucho, mucho más
  • Las funcionalidades se amplian gracias a miles de paquetes (plug-ins)

  • Cuando tengas duda, pruébalo! (Norman Matloff’s)

  • Estas aprendiendo un lenguaje, tendras que dedicar mucho tiempo para alcanzar un buen nivel en R, pero vale la pena.

  • Tolerancia a la frustración es un requisito. Al principio muchas cosas fallarán y volveran a fallar, hasta que luego empezaran a funcionar.

¿Cómo utilizar R?

  1. Instalar R
  2. En la nube
  3. En las diapos de clase utilizando ]

Explorando RStudio

  • Por defecto RStudio está organizado en los siguientes paneles:
    1. Script (izquierda arriba): Acá es donde revisas y editas los scripts.
    2. Consola (izquierda abajo): acá se ejecutan los comandos de R. Las salidas de R (outputs) aparecen acá.
    3. Global Environment (derecha arriba): variables almacenadas, funciones, y otros objetos de R aparecen acá.
    4. Misc (derecha abajo): Una variedad de pestañas que ayudan a buscar archivos, ver los gráficos, ver ayuda, etc.

Explorando RStudio

RStudio también tiene varias personalizaciones que ayudan a un mejor uso::

  • Click Tools –> Global Options –> Appearance para cambiar tipo de letra y color
  • Click Tools –> Global Options –> Code selecciona el cuadro que dice “Soft-wrap R source files” para ajustar el texto al ancho del panel.
  • Click Tools –> Global Options –> Code –> Display selecciona el cuadro que dice “Highlight selected line” y “Highlight R function calls”. Proporciona destacado de linea y funciones.

1.R como una calculadora

1+1
[1] 2
sqrt(9)
[1] 3
3^3
[1] 27
exp(10)
[1] 22026.47
pi
[1] 3.141593

1. Sintaxis de R

Ejemplo de script:

  • los comentarios # se utilizan para documentar funciones y su contenido.
  • objetos (variables) y funciones
  • el operador de asignación <-
  • el operador = para argumentos en una función
# Carga paquete {ggplot2}
library(ggplot2)

# nombree de variables
nombre_archivo <- 'datos.csv'

# cargar datos

data <- read.csv2(nombre_archivo,header = FALSE)

1. Sintaxis de R

Tener en mente

todo lo que hay en R es un objeto y todo lo que pasa en R es fruto de una función

1. Funciones y argumentos

  • Las funciones ejecutan acciones sobre los argumentos.
    • synatxis: nombre_funcion(argumentos)
    • ejemplo: mean(10)
  • Los argumentos son los datos de entrada - valores, expresiones, texto, etc.
    • Le dices a la función que argumentos necesita dentro de los parentesis.

Usa la función ls() para ver todos los objetos definidos. Notar que ls() no toma ningun argumento!

ls()

2. Tipos de datos básicos

Tipos de datos

Tipos de datos:
- Numéricos: integer y double
- Caracter
- Lógicos
- Complejos
- Raw

Numeric: integer o double

1 
[1] 1
x <- 1 
x = 1 
1
[1] 1
x <- 1 
x = 1 
class(x) 
[1] "numeric"
typeof(x) 
[1] "double"

Numeric: integer o double

y <- 1L 

z <- as.integer(1) 
class(y)
[1] "integer"
class(z) 
[1] "integer"
typeof(y)
[1] "integer"
typeof(z) 
[1] "integer"

Character

Siempre entre comillas: ' o "

pais<- 'Chile'
class(pais)
[1] "character"

No es lo mismo:

pais
[1] "Chile"
'pais'
[1] "pais"

Character

¿Qué pasa en este caso?

Chile
Error in eval(expr, envir, enclos): objeto 'Chile' no encontrado

Character: algunas funciones útiles

x <- 'R es el mejor lenguaje para análisis de datos'
nchar(x)
[1] 45
y <- substr(x,3,55)
y
[1] "es el mejor lenguaje para análisis de datos"
paste('Python', y)
[1] "Python es el mejor lenguaje para análisis de datos"

Character: algunas funciones útiles

x
[1] "R es el mejor lenguaje para análisis de datos"
gsub('R es el mejor lenguaje','R y Python son dos de los mejores lenguajes',x)
[1] "R y Python son dos de los mejores lenguajes para análisis de datos"

Logical

TRUE
[1] TRUE
class(TRUE)
[1] "logical"
FALSE
[1] FALSE
class(FALSE)
[1] "logical"

Algunos utilizan

T
[1] TRUE
F
[1] FALSE

NO lo hagan, puede generar errores díficiles de rastrear

Logical

Ejemplo:

T <- 4

is.logical(T)
[1] FALSE
TRUE <- 4
Error in TRUE <- 4: lado izquierdo de la asignación inválida (do_set)

Logical

Suelen ser el resultado de un cálculo

5 > 4
[1] TRUE
5 < 4
[1] FALSE
x <- 6

x == 6
[1] TRUE

Los valores lógicos pueden ser tratados como numéricos

TRUE = 1; FALSE = 0

TRUE + 1
[1] 2
FALSE + 1
[1] 1

3. Estructura de datos

Estructuras de datos

Estructuras de datos:
- vectores
- matrices
- arrays
- data.frame
- listas

Vectores

Hay dos tipos de vectores en R:

  • Vectores atómicos: homogéneos
    • Seis tipos: logicos, integer, double, character, complex, and raw. Vectores tipo integer y double son conocidos como vectores numericos.
  • Listas: hetereogéneos
    • son a veces llamados vectores recursivos, por que las listas puede contener otras listas.

Vectores atómicos

Almacena el mismo tipo de dato (numeric, character, logical)

c(1, 2, 3, 4) #numeric vector
[1] 1 2 3 4
c('a', 'b', 'c') #character vector
[1] "a" "b" "c"
c(TRUE, FALSE, TRUE) # logical vector
[1]  TRUE FALSE  TRUE

Vectores atómicos

¿Qué pasa si mezclamos diferentes tipos?

x <- c(1, TRUE, 'o')
class(x)
x

Importante:
- Jerarquia de Coerción: logical -> integer -> double -> character

¿Qué pasará con?

class(c('TRUE',1L))
[1] "character"

Numeric vector: algunas funciones

1:10 # crea una secuencia entre 1 y 10 con incremento de 1
 [1]  1  2  3  4  5  6  7  8  9 10
seq(from=1,to=10,by=2) #crea una secuencia entre 1 y 10 con incremento de 2
[1] 1 3 5 7 9
rep(2,times=10) # repite 2, 10 veces 
 [1] 2 2 2 2 2 2 2 2 2 2
rev(c(1,2,3,4)) # inverso de 1,2,3,4
[1] 4 3 2 1

Character vector: algunas funciones

Constantes integradas en R

letters
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
[20] "t" "u" "v" "w" "x" "y" "z"
month.name
 [1] "January"   "February"  "March"     "April"     "May"       "June"     
 [7] "July"      "August"    "September" "October"   "November"  "December" 

Para ver cuántos elementos tiene un vector usamos length

length(letters)
[1] 26
length(month.name)
[1] 12

Character vector: algunas funciones

Regular expresion (regex) pueden utilizarse para buscar texto por un patrón usamos grep.

month.name
 [1] "January"   "February"  "March"     "April"     "May"       "June"     
 [7] "July"      "August"    "September" "October"   "November"  "December" 
grep(pattern='a',month.name)
[1] 1 2 3 5

Para más información sobre regex vaya a regexr.com

Vectores con atributos

Los vectores pueden tener atributos (metadata)

x <- c(a=1, b=2, c=3)
x
a b c 
1 2 3 
attributes(x)
$names
[1] "a" "b" "c"
attr(x,'names')
[1] "a" "b" "c"

4. Tipos de datos derivados

Valores faltantes (NA: Not Available)

El análisis de datos faltantes es muy importante en análisis de datos

f <-  c(NA, 3, 2, NA)
f
[1] NA  3  2 NA
sum(is.na(f)) #contar cuantos NAs tiene el vector f
[1] 2
is.na(f) # busca en f los NAs, TRUE en la posicion que hay, FALSE en otro caso
[1]  TRUE FALSE FALSE  TRUE
TRUE + FALSE + FALSE + TRUE
[1] 2

Date-time

d <- as.Date('2020-08-27')
d
[1] "2020-08-27"
class(d)
[1] "Date"
d2 <- as.POSIXct('2020-08-27 10:30:20', tz='America/Santiago')
d2
[1] "2020-08-27 10:30:20 -04"
class(d2)
[1] "POSIXct" "POSIXt" 

Date-time

d - d2
[1] "-4374630-07-26"
as.POSIXct(d) -d2 #<<
Time difference of -14.50556 hours
d2
[1] "2020-08-27 10:30:20 -04"
d - as.Date(d2)
Time difference of 0 days

Factor

Las funciones as.________, convierten un tipo de dato a otro

x <-c(5,3,9,3,5,3,8,9,3,8,9)
y <- as.factor(x)
y
 [1] 5 3 9 3 5 3 8 9 3 8 9
Levels: 3 5 8 9

as.numeric(y)
 [1] 2 1 4 1 2 1 3 4 1 3 4
as.numeric(as.character(y))
 [1] 5 3 9 3 5 3 8 9 3 8 9
levels(y)
[1] "3" "5" "8" "9"

Factor

En escencia es un vector con attributos. Representa una variable nominal/categorica. Usados para test estadísticos.

x <- c('a','a','b','c','c','c')
v <- factor(x,levels = c('a','b','c')) 
v
[1] a a b c c c
Levels: a b c
attributes(v)
$levels
[1] "a" "b" "c"

$class
[1] "factor"

5. Estructura de datos

Estructuras de datos

Estructuras de datos:
- vectores
- matrices
- arrays
- data.frame
- listas

Matrix

vector tiene una dimensión, la matrix tiene 2

matrix(ncol=2,nrow=3)
     [,1] [,2]
[1,]   NA   NA
[2,]   NA   NA
[3,]   NA   NA
matrix(1:6,ncol=2,nrow=3)
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6
m <- matrix(1:6,ncol=2,nrow=3,byrow = TRUE)
m
     [,1] [,2]
[1,]    1    2
[2,]    3    4
[3,]    5    6
class(m)
[1] "matrix" "array" 
typeof(m)
[1] "integer"

Matrix: algunas funciones

a <- 1:3
b <- 4:6
c <- rbind(a,b) #<<
d <- cbind(a,b) #<<
c
  [,1] [,2] [,3]
a    1    2    3
b    4    5    6
d
     a b
[1,] 1 4
[2,] 2 5
[3,] 3 6
  [,1] [,2] [,3]
a    1    2    3
b    4    5    6
     1    4    7
     2    5    8
     3    6    9

Matrix: algunas funciones

nrow(f)
[1] 5
ncol(f)
[1] 3
dim(f)
[1] 5 3
length(f)
[1] 15
rownames(f)
[1] "a" "b" ""  ""  "" 
colnames(f)
NULL
colnames(f) <- c('x','y','z')
f
  x y z
a 1 2 3
b 4 5 6
  1 4 7
  2 5 8
  3 6 9

Data.frame

  • Es uno de los objetos más destacados, nace del mundo de software de análisis estadístico.

  • Cada columna corresponde a una variable y cada fila a una observación.

  • Puede almacenar columnas con diferentes tipos de datos

head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

Data.frame

¿Cómo creamos un data.frame?

id <- 1:6
nombres <- c('Paulina','Idania','Patricia','Natalia','Alejandro','Alvaro')
sexo <- c('F','F','F','F','M','M')
num_letras <- nchar(nombres)

df <- data.frame(id,nombres,sexo,num_letras)
df
  id   nombres sexo num_letras
1  1   Paulina    F          7
2  2    Idania    F          6
3  3  Patricia    F          8
4  4   Natalia    F          7
5  5 Alejandro    M          9
6  6    Alvaro    M          6

Data.frame

dim(df)
[1] 6 4
names(df)
[1] "id"         "nombres"    "sexo"       "num_letras"
colnames(df)
[1] "id"         "nombres"    "sexo"       "num_letras"
rownames(df)
[1] "1" "2" "3" "4" "5" "6"

Algunas cosas importantes

  • R es un lenguaje vectorizado por defecto.

Ejemplo

Aplicar la función log a cada elemento del vector v1.