Tipos, estructuras y operadores de datos

Una introducción al lenguaje de programación

Xavier Clemente García

Objetivo

Vamos a familiarizarnos con el entorno de Rstudio y la sintaxis de R.

Asignación de variables

¿Qué es una variable?
Puede definirse como un conjunto finito que almacena o implica información. Puede cambiarse, eliminarse o significar.

En el siguiente ejemplo verás una variable creada:

1+1
[1] 2

¿Pero y si quiero que esa operación anterior sea una variable?

suma<-1+1
suma
[1] 2

Ahora tengo una variable llamada suma.
Es necesario entender que puedo asociar mis variables. Ejemplo:

resta<- 1-3
#Asociar:
resultado<-suma*resta
resultado
[1] -4

Tipos de datos

Al igual que en otros lenguajes de programación como python, java, perl, matlab…, en R tendremos algunas clases de datos:

#Tipos de datos
x<- 5 #Numérico (int-float)
y<- "Hola" #Carácter (String)
z<- TRUE #Lógico (Booleano)

Los tipos de dato numérico pueden ser int o float. ¿Qué signfica esto?

x< 5 #Entero (int)
[1] FALSE
y<- 4.5 #Decimal o flotante (Float)

Existen otros tipos de datos que deberías conocer, por ejemplo:

c<-3+2i 
f<-factor(c("amarillo", "azul", "rojo")) #Factor 

Tip sobre datos

¿Qué pasa si no conozco la naturaleza de mis datos?

class(x)
[1] "numeric"
class(f)
[1] "factor"
typeof(c)
[1] "complex"

Ejercicio 1

En Rstudio van a escribir varios conjuntos de variables según el tipo de dato. Tienen 5 minutos!

Estructuras de datos

  • Vectores (c())
  • Factores (factor())
  • Matrices (matrix())
  • Listas (list())
  • Data frames (data.frame())

Vectores

Digamos que estás haciendo un trabajo en botánica y quieres hacer un listado de especies de Asteraceae.
¿Qué herramienta usas?
La lista, exacto…

sp_asteraceae<-c("*Helianthus annuus*", "*Pterocaulon alopecuroides*", "*Senecio vulgaris*", "*Arnica montana*", "*Artemisa vulgaris*", "*Calendula officinallis*", "*Espeletia hartwegiana* ")
#La lista se puede llamar bajo el mismo nombre. 
sp_asteraceae
[1] "*Helianthus annuus*"         "*Pterocaulon alopecuroides*"
[3] "*Senecio vulgaris*"          "*Arnica montana*"           
[5] "*Artemisa vulgaris*"         "*Calendula officinallis*"   
[7] "*Espeletia hartwegiana* "   

En este punto solo tendrás una lista, pero puedes crear varias listas y volverlas una sola tabla. Por ejemplo si es para armar datos en una tabla sobre etnobotánica, podrías hacerlo así…

ncomunes<-c("Girasol", "Hierba del piojo o árnica de montaña", "Senecio común", "Árnica", "Ajenjo o artemisa", "Caléndula", "Frailejón")
uso_medicinal<-c(3,4,2,5,6,5,1)
uso_alimenticio<-c(2,6,3,7,2,8,0)
uso_ornamental<-c(2,6,7,8,4,2,0)

Si quisieramos armar una tabla para los siguientes datos ya podríamos hacerlo debido a que hemos creado propiamente muchas listas que pueden indexarse.

tabla_etno<- data.frame(sp_asteraceae, ncomunes, uso_medicinal,uso_alimenticio, uso_ornamental)
#Debo hacer un arreglo en los nombres de columnas
colnames(tabla_etno)<-c("Nombre científico", "Nombres comúnes", "Uso medicinal", "Uso alimenticion", "Uso ornamental")
Nombre científico Nombres comúnes Uso medicinal Uso alimenticion Uso ornamental
Helianthus annuus Girasol 3 2 2
Pterocaulon alopecuroides Hierba del piojo o árnica de montaña 4 6 6
Senecio vulgaris Senecio común 2 3 7
Arnica montana Árnica 5 7 8
Artemisa vulgaris Ajenjo o artemisa 6 2 4
Calendula officinallis Caléndula 5 8 2
Espeletia hartwegiana Frailejón 1 0 0

Dataframes

Miremos esta sintaxis para dataframes…

escorpiones <- data.frame(
  Especie = c("Tityus fuhrmanni", "Centruroides margaritatus", "Bothriurus coriaceus", "Buthus occitanus"),
  Longitud_mm = c(45, 65, 50, 75),
  Veneno_Toxico = c(TRUE, TRUE, FALSE, TRUE)  
)

escorpiones
                    Especie Longitud_mm Veneno_Toxico
1          Tityus fuhrmanni          45          TRUE
2 Centruroides margaritatus          65          TRUE
3      Bothriurus coriaceus          50         FALSE
4          Buthus occitanus          75          TRUE

Listas

Una lista puede almacenar distintos tipos de datos en una misma estructura

# Crear una lista con información sobre Drosophila melanogaster
drosophila <- list(
  Nombre_Cientifico = "*Drosophila melanogaster*",
  Ciclo_Vida_Dias = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),  # Ciclo de vida en días
  GenesImportantes = c("white", "yellow", "ebony", "bithorax"),
  Longitud_mm = 2.5,
  Modelo_Biologico = TRUE
)

drosophila
$Nombre_Cientifico
[1] "*Drosophila melanogaster*"

$Ciclo_Vida_Dias
 [1]  1  2  3  4  5  6  7  8  9 10

$GenesImportantes
[1] "white"    "yellow"   "ebony"    "bithorax"

$Longitud_mm
[1] 2.5

$Modelo_Biologico
[1] TRUE

¿Qué pasó aquí?
Simplemente una sola variable “Drosophila” ahora nos puede entregar diferentes características de una especie. Cómo una pokedex.

Operadores de datos

Operadores aritméticos

Esperanza de vida de algunas especies de Asteraceae.

# Tiempo de vida en años de algunas especies
vida_helianthus <- 1    # Anual
vida_arnica <- 2        # Bianual
vida_artemisia <- 3     # Perenne

# Operaciones
total_vida <- vida_helianthus + vida_arnica + vida_artemisia  # Suma
vida_promedio <- total_vida / 3   # Promedio de longevidad
vida_doble_arnica <- vida_arnica * 2  # Multiplicación
vida_potencia <- vida_artemisia^2   # Potencia

# Mostrar resultados
total_vida
[1] 6
vida_promedio
[1] 2
vida_doble_arnica
[1] 4
vida_potencia
[1] 9

Operadores relacionales

Longitudes en especies de escorpiones

# Longitudes en cm de dos especies
long_pandinus <- 10   # Pandinus imperator (Escorpión emperador)
long_tityus <- 7      # Tityus pachyurus 

# Comparaciones
long_pandinus > long_tityus   # ¿Pandinus es más grande?
[1] TRUE
long_pandinus == long_tityus  # ¿Tienen la misma longitud?
[1] FALSE
long_tityus != 10  # ¿Tityus NO mide 10 cm?
[1] TRUE

Operadores lógicos

Este sería un ejemplo con temperatura de hábitat en Drosophila

# Rango de temperatura ideal en °C
temp_drosophila <- 25
temp_min <- 20
temp_max <- 30

# Evaluación de condiciones
(temp_drosophila >= temp_min) & (temp_drosophila <= temp_max)  # ¿Está dentro del rango?
[1] TRUE
(temp_drosophila < temp_min) | (temp_drosophila > temp_max)  # ¿Fuera del rango?
[1] FALSE
! (temp_drosophila == 25)  # ¿No es exactamente 25°C?
[1] FALSE

Operadores de asignación

Frecuencia de polinizadores en plantas de la familia Asteraceae

# Frecuencia de visitas por día
abejas <- 30
mariposas <- 12
escarabajos = 8  # También se puede usar "="

# Alternativa de asignación derecha
50 -> colibries  

# Mostrar variables
abejas
[1] 30
mariposas
[1] 12
escarabajos
[1] 8
colibries
[1] 50

Ejercicio 2

Elaborar un ejemplo de cada una de las estructuras de datos vistas en la clase. Tienen el resto del día!

Muchas gracias