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
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
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
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"
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"
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
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
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
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
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
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
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"
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.
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.
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"
¿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
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"
is.data.frame(midf)
## [1] TRUE
!is.matrix(midf)
## [1] TRUE
!is.matrix(m)
## [1] FALSE
is.data.frame(m)
## [1] FALSE
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
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