1.7. Estructuras de Datos

Diversas estructuras de datos para diferentes usos y paquetes del sistema.


Estructuras de Datos

1.7.1. Vectores

Al completar esta sección podrás crear vectores y manipular los datos contenidos en ellos.

Un vector es un arreglo unidimensional que puede contener datos numéricos, textuales, y lógicos. Para construirlos se utiliza la función de construcción c.

# datos numéricos
vec.num <- c(1, 2, 5, 3, 6, -2, 2.3)
vec.num
## [1]  1.0  2.0  5.0  3.0  6.0 -2.0  2.3
class(vec.num)
## [1] "numeric"
# datos caracteres
vec.car <- c("uno", "dos", "tres")
vec.car
## [1] "uno"  "dos"  "tres"
# combinando números y texto, todos se convierten a texto:
vec.combo <- c(3, 5, 7, "tres", "cinco", "siete")
vec.combo
## [1] "3"     "5"     "7"     "tres"  "cinco" "siete"
class(vec.combo)
## [1] "character"
# los datos se mantienen numéricos si se combinan números y operadores lógicos:
vec.oper <- c(2/5, 3, 5+3, 4-7, 4 == 4.01, 3.5 < 3.5001, "data" < "2data")
vec.oper
## [1]  0.4  3.0  8.0 -3.0  0.0  1.0  0.0
# vectors can be created with the content of variables:
vec.var <- c(vec.num, vec.oper, vec.combo)
vec.var
##  [1] "1"     "2"     "5"     "3"     "6"     "-2"    "2.3"   "0.4"   "3"    
## [10] "8"     "-3"    "0"     "1"     "0"     "3"     "5"     "7"     "tres" 
## [19] "cinco" "siete"
# la función seq(...) se puede usar para crear vectores numéricos:
vec.seq <- seq(3, 4.5, 0.2) # c(...) no es necesaria
vec.seq
## [1] 3.0 3.2 3.4 3.6 3.8 4.0 4.2 4.4


Para extraer valores específicos de los datos en un vector, usamos corchetes [..] que contienen las posiciones que nos interesa extraer.

# creamos un vector con una secuencia numérica: 
vec.ref <- c(3:11) #secuencia de 3 a 11, de uno en uno
vec.ref
## [1]  3  4  5  6  7  8  9 10 11
# queremos conocer los valores de los tres primeros elementos y del penúltimo elemento
length(vec.ref) # para saber cuantos elementos tiene
## [1] 9
# localizamos los valores:
vec.ref[c(1:3, 8)] 
## [1]  3  4  5 10
# lo podemos hacer también por eliminación:
vec.ref[c(-(4:7), -9)]
## [1]  3  4  5 10


Con los vectores podemos realizar operaciones matemáticas.

# multiplicar por un escalar
vec.ref * 10
## [1]  30  40  50  60  70  80  90 100 110
# suma de vectores
vec.sum <- seq(1:9)
vec.ref + vec.sum
## [1]  4  6  8 10 12 14 16 18 20
# ajuste (y aviso) cuando tienen tamaños diferentes
vec.su <- seq(1:6)
vec.sum * vec.su
## Warning in vec.sum * vec.su: longer object length is not a multiple of shorter
## object length
## [1]  1  4  9 16 25 36  7 16 27


Home


1.7.2. Matrices

Al terminar esta sección podrás construir matrices a partir de vectores.

Una matriz es un arreglo en dos dimensiones, que contiene una sola clase de datos (numérico, caracter, o lógico). Las matrices se construyen con la función matrix.

# vector de datos para crear la matriz:
vec.diabetes <- c(32,90,160,26,130,200,40,200,180,55,150,260)
# nombres de filas (casos) y columnas (variables):
RowN <- c("patient 1","patient 2","patient 3","patient 4")
ColN <- c("Age","Glucose","Cholesterol")
# matriz con la función matrix:
mtx.diabetes <- matrix(vec.diabetes,
                       ncol = 3,
                       byrow = TRUE,
                       dimnames = list(RowN,ColN)
                       )
mtx.diabetes
##           Age Glucose Cholesterol
## patient 1  32      90         160
## patient 2  26     130         200
## patient 3  40     200         180
## patient 4  55     150         260
# verificando si es una matriz:
class(mtx.diabetes)
## [1] "matrix" "array"


La extracción de valores de una matriz es también por posición, pero hay que especificar filas y columnas.

# selección de todas las filas y columnas 2 y 3
new.matrix1 <- mtx.diabetes[ ,2:3]
new.matrix1
##           Glucose Cholesterol
## patient 1      90         160
## patient 2     130         200
## patient 3     200         180
## patient 4     150         260
# seleccionando el primero y cuarto paciente y edad y colesterol
new.matrix2 <- mtx.diabetes[c(1,4),c(1,3)]
new.matrix2
##           Age Cholesterol
## patient 1  32         160
## patient 4  55         260

1.7.3. Data frames

Al finalizar esta sección producirás y manipularás data frames.

Un data frame es un tipo de matriz, en la cual las columnas pueden ser de distintas clases de datos (numéricos, texto, lógicos). Es la estructura de datos de uso común en R. Se crean utilizando la función data.frame, usualmente a partir de vectores, o importando datos, como veremos más adelante.

# vectores columnas
ID <- c(1L,2L,3L,4L)
chol <- c(160, 200, 180, 260)
glu <- c(90, 130, 200, 150)
age <- c(32,26,40,55)
sex <- c("M","F","M","M")
diabetes <- c("neg","pos","pos","neg")
# data frame a partir de vectores
patient_data <- data.frame(ID, age, sex, glu, chol, diabetes)
class(patient_data)
## [1] "data.frame"
patient_data
##   ID age sex glu chol diabetes
## 1  1  32   M  90  160      neg
## 2  2  26   F 130  200      pos
## 3  3  40   M 200  180      pos
## 4  4  55   M 150  260      neg


Podemos cambiar el nombre a las columnas.

# cambio de nombre de las columnas
new.patient_data <- setNames(patient_data, c("Patient ID","Age","Birth Sex","Blood Glucose","Cholesterol","Diabetes Diagnosis"))
new.patient_data
##   Patient ID Age Birth Sex Blood Glucose Cholesterol Diabetes Diagnosis
## 1          1  32         M            90         160                neg
## 2          2  26         F           130         200                pos
## 3          3  40         M           200         180                pos
## 4          4  55         M           150         260                neg


La selección y extracción de datos de un data frame es similar a hacerlo de una matriz, pero además se pueden usar operadores lógicos, usando columnas como factores.

# selección de columnas por nombre
select.df1 <- new.patient_data[ ,c("Blood Glucose","Diabetes Diagnosis")]
select.df1
##   Blood Glucose Diabetes Diagnosis
## 1            90                neg
## 2           130                pos
## 3           200                pos
## 4           150                neg
# selección usando un operador lógico
select.df2 <- new.patient_data[new.patient_data$'Diabetes Diagnosis' == "pos",]
select.df2
##   Patient ID Age Birth Sex Blood Glucose Cholesterol Diabetes Diagnosis
## 2          2  26         F           130         200                pos
## 3          3  40         M           200         180                pos


Una estructura de uso más reciente, es la que se conoce como tibble, muy parecida a un data.frame pero con algunas peculiaridades que la hacen más práctica para el manejo de datos.

Home


1.7.4. Listas

Al finalizar esta sección conocerás la estructura de una lista y cómo extraer datos de ella.

Una lista es una colección ordenada de diversos objetos (vectores, matrices, data.frames, arreglos, otras listas). Es la estructura de datos más compleja usada en R, y muchas funciones estadísticas producen resultados en forma de listas, de las cuales se pueden extraer resultados específicos. Se crean usando la función list, y para seleccionar objetos o valores específicos, se utilizan corchetes dobles, [[…]].

# diferentes objetos
g <- "My First List"
h <- c(25, 26, 18, 39)
j <- matrix(1:10, nrow=5)
k <- c("one", "two", "three")
# creando una lista
mylist <- list(title=g, ages=h, j, k)   # algunos con nombre
class(mylist)
## [1] "list"
mylist
## $title
## [1] "My First List"
## 
## $ages
## [1] 25 26 18 39
## 
## [[3]]
##      [,1] [,2]
## [1,]    1    6
## [2,]    2    7
## [3,]    3    8
## [4,]    4    9
## [5,]    5   10
## 
## [[4]]
## [1] "one"   "two"   "three"
# otra forma de ver el contenido de la lista
str(mylist)
## List of 4
##  $ title: chr "My First List"
##  $ ages : num [1:4] 25 26 18 39
##  $      : int [1:5, 1:2] 1 2 3 4 5 6 7 8 9 10
##  $      : chr [1:3] "one" "two" "three"
# para seleccionar contenido dentro de la lista
mylist[[2]] # usando la posición
## [1] 25 26 18 39
mylist[["ages"]] # usando el nombre si lo tiene
## [1] 25 26 18 39

Podemos asignar a una variable algún contenido (objeto) de una lista.

# extrayendo la matriz
matriz <- mylist[[3]]
matriz
##      [,1] [,2]
## [1,]    1    6
## [2,]    2    7
## [3,]    3    8
## [4,]    4    9
## [5,]    5   10



Referencias

Kabacoff, R. I. (2015). R in Action: Data analysis and graphics with R (Second Edition). Manning, Shelter Island, NY.

Lander, J. P. (2017). R for everyone: Advanced analytics and graphics (Second edition). Addison-Wesley, Boston, MA.

Home