1 Vectores y listas

1.1 Cómo crear vectores

1.1.1 c(…)

Ejemplos de vectores vistos anteriormente

mivector <- c("julia","ruben","alejandro")
mivector
## [1] "julia"     "ruben"     "alejandro"
mivector2 <- c(2,4,6,8,10,12,14,16)
mivector2
## [1]  2  4  6  8 10 12 14 16

1.1.2 secuencias con : y con seq(…)

Podemos utilizar el operador : para generar una secuencia de números en un rango determinado. También podemos utilizar la función seq() para hacer secuencia

1:10 
##  [1]  1  2  3  4  5  6  7  8  9 10
seq(from=5, to=25, by=5)
## [1]  5 10 15 20 25
seq(from=2, to=20, by=2)
##  [1]  2  4  6  8 10 12 14 16 18 20
seq(from=2, to=10, by=2)
## [1]  2  4  6  8 10

1.1.3 la función length()

Podemos manipular la longitud del vector con la función lenght()

v <- 1:10
v
##  [1]  1  2  3  4  5  6  7  8  9 10
length(v)
## [1] 10
length(v) <- 5
v
## [1] 1 2 3 4 5
length(v) <- 10
v
##  [1]  1  2  3  4  5 NA NA NA NA NA

1.1.4 Otras operaciones con vectores

v <- 1:12
v
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12
length(v)
## [1] 12
v[12]
## [1] 12
v[5]
## [1] 5
v[15]
## [1] NA
v[15] <- 30
v[14]<-"julia"
v
##  [1] "1"     "2"     "3"     "4"     "5"     "6"     "7"     "8"    
##  [9] "9"     "10"    "11"    "12"    NA      "julia" "30"
rm(v)
rm(mivector2)

v <- 1:10 # vector de numeros
v
##  [1]  1  2  3  4  5  6  7  8  9 10
v <- c(1,2,3,4,"julia") #vector de numeros y characteres
v
## [1] "1"     "2"     "3"     "4"     "julia"

1.2 Listas

En una lista los elementos es una colección ordenada de objetos hay que pensar en una estructura de arbol (o esquema) donde de una rama salen otras ramas tambien podemos pensar en ellas como “bloques de bloques”. La longitud de una lista es el numero de elementos que le hemos metido.

milista <- list("Quercus","Betula","Abies","Fagus","Taxus")
milista
## [[1]]
## [1] "Quercus"
## 
## [[2]]
## [1] "Betula"
## 
## [[3]]
## [1] "Abies"
## 
## [[4]]
## [1] "Fagus"
## 
## [[5]]
## [1] "Taxus"

1.2.1 Acceder a los elementos de una lista.

Podemos acceder por al posición de cada elemento dentro de la lista

milista[1]
## [[1]]
## [1] "Quercus"
milista[[1]]
## [1] "Quercus"

O si los elementos tienen nombre, por sus nombres, utilizando el simbolo del $ seguido del nombre para referirnos a un elemento dentro de una lista

names(milista)
## NULL
names(milista) <- c("sp1", "sp2", "sp3", "sp4", "sp5")
names(milista)
## [1] "sp1" "sp2" "sp3" "sp4" "sp5"
milista
## $sp1
## [1] "Quercus"
## 
## $sp2
## [1] "Betula"
## 
## $sp3
## [1] "Abies"
## 
## $sp4
## [1] "Fagus"
## 
## $sp5
## [1] "Taxus"
milista$sp1 # para referirnos a un elemento dentro de una lista
## [1] "Quercus"
milista[[1]]
## [1] "Quercus"
milista$sp1[2]
## [1] NA
milista <- list(1,2,3,4,5)
milista
## [[1]]
## [1] 1
## 
## [[2]]
## [1] 2
## 
## [[3]]
## [1] 3
## 
## [[4]]
## [1] 4
## 
## [[5]]
## [1] 5
names(milista)<-c("sp1", "sp2", "sp3", "sp4", "sp5")
names(milista)
## [1] "sp1" "sp2" "sp3" "sp4" "sp5"
milista
## $sp1
## [1] 1
## 
## $sp2
## [1] 2
## 
## $sp3
## [1] 3
## 
## $sp4
## [1] 4
## 
## $sp5
## [1] 5

2 Arrays

Parecidos a un vector pero con más de dos dimensiones. Yo las llamo CAPAS.

miarray36 <- array(data=1:36, dim=c(3,4,3)) # ojo al numero de capas: 3 x 4 = 12
miarray36
## , , 1
## 
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    2    5    8   11
## [3,]    3    6    9   12
## 
## , , 2
## 
##      [,1] [,2] [,3] [,4]
## [1,]   13   16   19   22
## [2,]   14   17   20   23
## [3,]   15   18   21   24
## 
## , , 3
## 
##      [,1] [,2] [,3] [,4]
## [1,]   25   28   31   34
## [2,]   26   29   32   35
## [3,]   27   30   33   36

2.1 Acceder a los elementos de un array

Para acceder a los elementos de un array hay que decirle la fila, la columna y la capa. miarray36[,,,]

miarray36[1,2,3]
## [1] 28
miarray36[1,3,3]
## [1] 31

Por ejemplo si selecciono la primera fila de todas las capas (con todas las columnas)

miarray36[1,,] # nos lo ha puesto en forma de matriz
##      [,1] [,2] [,3]
## [1,]    1   13   25
## [2,]    4   16   28
## [3,]    7   19   31
## [4,]   10   22   34

Otro ejemplo:

miarray36[1,2:3,1]
## [1] 4 7

3 Matrices

Utilizamos la función matrix, indicando los datos que queremos que aparezcan, el numero de filas y el numero de columnas

m <- matrix(data=c(101:112), nrow=3, ncol=4) # crear una matriz
m
##      [,1] [,2] [,3] [,4]
## [1,]  101  104  107  110
## [2,]  102  105  108  111
## [3,]  103  106  109  112

3.1 Acceder a los elementos de una matriz

Ejemplos para aprender a acceder a los elementos de una matriz

m[3,]
## [1] 103 106 109 112
m[3,1] # tercera fila, primera columna
## [1] 103
m[3,4] # tercera fila, cuarta columna
## [1] 112

Como seleccionar una parte de la matriz

m[3,]#fila completa
## [1] 103 106 109 112
m[,4]#columna completa
## [1] 110 111 112
m
##      [,1] [,2] [,3] [,4]
## [1,]  101  104  107  110
## [2,]  102  105  108  111
## [3,]  103  106  109  112
m[1:2,1:2] # de la primera a la segunda fila, de la primera a la segunda columna
##      [,1] [,2]
## [1,]  101  104
## [2,]  102  105
m[1:2,] # de la primera a la segunda fila, todas las columnas
##      [,1] [,2] [,3] [,4]
## [1,]  101  104  107  110
## [2,]  102  105  108  111
m
##      [,1] [,2] [,3] [,4]
## [1,]  101  104  107  110
## [2,]  102  105  108  111
## [3,]  103  106  109  112
m[,3:4] # todas las filas, de la tercera a la cuarta columna
##      [,1] [,2]
## [1,]  107  110
## [2,]  108  111
## [3,]  109  112
m
##      [,1] [,2] [,3] [,4]
## [1,]  101  104  107  110
## [2,]  102  105  108  111
## [3,]  103  106  109  112
m[3:4] # por orden
## [1] 103 104
m[6:7]
## [1] 106 107
m[3] 
## [1] 103
m[-3,] #quitando una fila
##      [,1] [,2] [,3] [,4]
## [1,]  101  104  107  110
## [2,]  102  105  108  111
m[,-3] #quitando una columna
##      [,1] [,2] [,3]
## [1,]  101  104  110
## [2,]  102  105  111
## [3,]  103  106  112
matriz.peque <- m[,-3]  # reasignar la matriz con otros valores
matriz.peque
##      [,1] [,2] [,3]
## [1,]  101  104  110
## [2,]  102  105  111
## [3,]  103  106  112

3.2 Cambiar valores dentro de una matriz

Asignar valores o hacer cambios de valores

m[1] <- 5
m
##      [,1] [,2] [,3] [,4]
## [1,]    5  104  107  110
## [2,]  102  105  108  111
## [3,]  103  106  109  112
m[1:2,1:2] <- matrix(c(1:4),nrow=2,ncol=2)
m
##      [,1] [,2] [,3] [,4]
## [1,]    1    3  107  110
## [2,]    2    4  108  111
## [3,]  103  106  109  112
m[2,3]<-1000
m
##      [,1] [,2] [,3] [,4]
## [1,]    1    3  107  110
## [2,]    2    4 1000  111
## [3,]  103  106  109  112
is.matrix(m)
## [1] TRUE
is.matrix(as.matrix(1:10))
## [1] TRUE
is.matrix(v)
## [1] FALSE

3.3 Ejemplo con matrices. Funciones class, rownames, colnames, dimnames y attributes

Esto es un ejemplo simplemente, para que practiques. Se utiliza la función class() para consultar la clase de objeto con el que trabajamos. También las funciones rownames(), colnames() para consultar nombres de filas y columnas y la función dimnames()

mdat <- matrix(c(1,2,3, 11,12,13), nrow = 2, ncol = 3, byrow = TRUE,
               dimnames = list(c("row1", "row2"),
                               c("C.1", "C.2", "C.3")))
mdat
##      C.1 C.2 C.3
## row1   1   2   3
## row2  11  12  13
class(mdat) 
## [1] "matrix"
rownames(mdat)
## [1] "row1" "row2"
colnames(mdat)
## [1] "C.1" "C.2" "C.3"
dimnames(mdat)
## [[1]]
## [1] "row1" "row2"
## 
## [[2]]
## [1] "C.1" "C.2" "C.3"

Los atributos de la matriz se consultan con attributes() que además se pueden cambiar como ves en el ejemplo.

attributes(mdat) 
## $dim
## [1] 2 3
## 
## $dimnames
## $dimnames[[1]]
## [1] "row1" "row2"
## 
## $dimnames[[2]]
## [1] "C.1" "C.2" "C.3"
dim(mdat)
## [1] 2 3
dim(mdat) <- NULL
mdat # al quitarle las dimensiones a la matriz la transformo en un vector
## [1]  1 11  2 12  3 13
class(mdat) # class se utiliza para consultar la clase de objeto
## [1] "numeric"

4 Marcos de datos o data frames

Los data frames son listas de variables del mismo numero de filas. Son muy útiles para almacenar datos en R. Lo podemos traducir como una “TABLA”, con una estructura bidimensional (filas x columnas), similar a una matriz, pero la diferencia es que puede contener diferentes tipos de elementos (numeros, texto,…). No todos los elementos han de ser iguales como en una matriz, que ha de estar compuesta por ejemplo, siempre por números, o siempre por texto.

Una de las limitaciones del data frame, para que sea una tabla, es que todas las columnas tienen que tener la misma longitud. Si no fuese así, sería UNA LISTA, es decir una coleccion de objetos o variables de cualquier, tipo, longitud o estructura.

4.1 Cómo crear un data frame

Lo primero que podemos hacer es consultar la ayuda, que nos dará información útil acerca de los data frames

?data.frame #consultamos la información de ayuda

Creamos un data frame, y consultamos atributos del mismo con las funciones class(), mode(), is.data.frame(), is.list().

especies <- c("Iris_setosa", "Iris_virginica", "Iris_versicolor")
ID <- c(1:3)
presencia <- c(TRUE, TRUE, FALSE)

data.frame(especies, ID, presencia)
##          especies ID presencia
## 1     Iris_setosa  1      TRUE
## 2  Iris_virginica  2      TRUE
## 3 Iris_versicolor  3     FALSE
data.frame(especies = c("Iris_setosa", "Iris_virginica", "Iris_versicolor"),
           ID = c(1:3), presencia = c(TRUE, TRUE, FALSE))
##          especies ID presencia
## 1     Iris_setosa  1      TRUE
## 2  Iris_virginica  2      TRUE
## 3 Iris_versicolor  3     FALSE
midataframe <- data.frame(especies, ID, presencia)

class(midataframe) ##la funcion class nos indica que tipo de objeto es
## [1] "data.frame"
mode(midataframe)
## [1] "list"
is.data.frame(midataframe)   #funcion is.data.frame
## [1] TRUE
is.list(midataframe)        # funcion is.list
## [1] TRUE

Una característica interesantes es que un data frame también es una lista. Pero una lista no es un data.frame. Para serlo tiene que cumplir el requerimiento de que todos los elementos tengan la misma longitud.

4.2 Acceso a los elementos de un data frame

Para empezar le cambio el nombre a otro más cómodo. Ahora puedo hacer una consulta por columnas utilizando los corchetes o brackets []

midf <- midataframe
midf
##          especies ID presencia
## 1     Iris_setosa  1      TRUE
## 2  Iris_virginica  2      TRUE
## 3 Iris_versicolor  3     FALSE
midf[1]
##          especies
## 1     Iris_setosa
## 2  Iris_virginica
## 3 Iris_versicolor
midf[2]
##   ID
## 1  1
## 2  2
## 3  3
midf[3]
##   presencia
## 1      TRUE
## 2      TRUE
## 3     FALSE

Consultas de columnas que te devuelve un vector:

midf[,2]
## [1] 1 2 3
midf[,3]
## [1]  TRUE  TRUE FALSE
midf[,1]
## [1] Iris_setosa     Iris_virginica  Iris_versicolor
## Levels: Iris_setosa Iris_versicolor Iris_virginica

Consulta por filas que te devuelve un vector:

midf[1,]
##      especies ID presencia
## 1 Iris_setosa  1      TRUE
midf[2,]
##         especies ID presencia
## 2 Iris_virginica  2      TRUE
midf[3,]
##          especies ID presencia
## 3 Iris_versicolor  3     FALSE
midf[,1]
## [1] Iris_setosa     Iris_virginica  Iris_versicolor
## Levels: Iris_setosa Iris_versicolor Iris_virginica
dimnames(midf)  #dimensiones
## [[1]]
## [1] "1" "2" "3"
## 
## [[2]]
## [1] "especies"  "ID"        "presencia"
dim(midf)
## [1] 3 3

Los nombres de un data frame son los nombres de las variables que contiene. Es decir, el nombre de las columnas:

names(midf)
## [1] "especies"  "ID"        "presencia"
rownames(midf)
## [1] "1" "2" "3"
colnames(midf)
## [1] "especies"  "ID"        "presencia"

Con el simbolo $ accedo a las variables, ejemplo especies:

midf$especies #son vectores con niveles (levels)
## [1] Iris_setosa     Iris_virginica  Iris_versicolor
## Levels: Iris_setosa Iris_versicolor Iris_virginica
midf[,1]
## [1] Iris_setosa     Iris_virginica  Iris_versicolor
## Levels: Iris_setosa Iris_versicolor Iris_virginica
midf$ID
## [1] 1 2 3
levels(midf$especies)
## [1] "Iris_setosa"     "Iris_versicolor" "Iris_virginica"
levels(midf$presencia)# consulta de los levels (tipos de entradas)
## NULL
table(midf$presencia) # me hace una tabla de valores que aparecen
## 
## FALSE  TRUE 
##     1     2
class(midf$presencia) # clase de cada variable dentro del data.frame
## [1] "logical"
class(midf$especies)
## [1] "factor"
class(midf$ID)
## [1] "integer"

4.3 Cómo transformar una matriz en un data frame

¿Podemos transformar una matriz en data frame? Pues sí…

m <- matrix(data=c(101:112), nrow=3, ncol=4) # crear una matriz
m
##      [,1] [,2] [,3] [,4]
## [1,]  101  104  107  110
## [2,]  102  105  108  111
## [3,]  103  106  109  112
# Forma 1 de hacerlo:
data.frame(m)
##    X1  X2  X3  X4
## 1 101 104 107 110
## 2 102 105 108 111
## 3 103 106 109 112
# Forma 2:
as.data.frame(m)
##    V1  V2  V3  V4
## 1 101 104 107 110
## 2 102 105 108 111
## 3 103 106 109 112

4.4 Cómo transformar un data frame en matriz

Podemos cambiar un data.frame a matriz convirtiendo todos al mismo tipo, por ejemplo caracter

as.matrix(midf)
##      especies          ID  presencia
## [1,] "Iris_setosa"     "1" " TRUE"  
## [2,] "Iris_virginica"  "2" " TRUE"  
## [3,] "Iris_versicolor" "3" "FALSE"

5 Funciones interesantes

5.1 funciones del grupo is.matrix; is.data.frame…

is.data.frame(midf)
## [1] TRUE
!is.matrix(midf)
## [1] TRUE
!is.matrix(m)
## [1] FALSE
is.data.frame(m)
## [1] FALSE

5.2 Las funciones factor(), table(), rep()

color.flor <- c("rosa", "blanca", "blanca", "azul", "rosa")
color.flor
## [1] "rosa"   "blanca" "blanca" "azul"   "rosa"
is.factor(color.flor)
## [1] FALSE
color.flor <- factor(c("rosa", "blanca", "blanca", "azul", "rosa"))
color.flor
## [1] rosa   blanca blanca azul   rosa  
## Levels: azul blanca rosa
is.factor(color.flor)
## [1] TRUE
#directamente te asigna niveles (levels)


# Podéis explorar la función rep() más en profundidad en la help de R
color.flor <- rep(c("rosa", "blanca", "blanca", "azul", "rosa"), times=10)
color.flor
##  [1] "rosa"   "blanca" "blanca" "azul"   "rosa"   "rosa"   "blanca"
##  [8] "blanca" "azul"   "rosa"   "rosa"   "blanca" "blanca" "azul"  
## [15] "rosa"   "rosa"   "blanca" "blanca" "azul"   "rosa"   "rosa"  
## [22] "blanca" "blanca" "azul"   "rosa"   "rosa"   "blanca" "blanca"
## [29] "azul"   "rosa"   "rosa"   "blanca" "blanca" "azul"   "rosa"  
## [36] "rosa"   "blanca" "blanca" "azul"   "rosa"   "rosa"   "blanca"
## [43] "blanca" "azul"   "rosa"   "rosa"   "blanca" "blanca" "azul"  
## [50] "rosa"

Los factores son los elementos de este vector ordenados. Nos ayudan a condensar la información cuando tenemos muchas observaciones y cuando trabajamos con valores categóricos. Ejemplo:

color.flor<- factor(color.flor)
levels(color.flor)
## [1] "azul"   "blanca" "rosa"
table(color.flor) # me hace una tabla resumen
## color.flor
##   azul blanca   rosa 
##     10     20     20
summary(color.flor)
##   azul blanca   rosa 
##     10     20     20

6 Para recordar…

midf$especies
## [1] Iris_setosa     Iris_virginica  Iris_versicolor
## Levels: Iris_setosa Iris_versicolor Iris_virginica
midf$especies[3]
## [1] Iris_versicolor
## Levels: Iris_setosa Iris_versicolor Iris_virginica
midf$ID
## [1] 1 2 3
midf$ID[1]
## [1] 1
midf[,1][1]
## [1] Iris_setosa
## Levels: Iris_setosa Iris_versicolor Iris_virginica
midf[1,]
##      especies ID presencia
## 1 Iris_setosa  1      TRUE
midf[1,][2]<-150
midf
##          especies  ID presencia
## 1     Iris_setosa 150      TRUE
## 2  Iris_virginica   2      TRUE
## 3 Iris_versicolor   3     FALSE