Diversas estructuras de datos para diferentes usos y paquetes del sistema.
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
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
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.
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.