################################################################################ ### TALLER SOBRE FUNDAMENTOS DE R ### ### PRESENTACIÓN 3.2: OBJETOS ### ### ### ### Center for Conservation and Sustainable Development ### ### Missouri Botanical Garden ### ### Stitio en la red: rbasicsworkshop.weebly.com ### ################################################################################ ### C. CLASES DE OBJETOS ####################################################### # 1. Vectores: 1 dimensión - numéricos, caracteres, lógicos # 2. Factores: 1 dimensión - niveles de un factor # 2. Matrices: 2 dimensiones # 3. Arreglos: n dimensiones # 4. Marcos de datos (data frames): 2 dimensiones # 5. Lista # 6. Otras clases: e.g. lm, phylo, shapefile, etc. ## IMPORTANTE: los objetos tiene ATRIBUTOS que definen como se comportan en R ## ### D. VECTORES ################################################################ # Los vectores representan una secuencia lineal de valores, cada valor con una # posición en la secuencia: abund.t1 abund.t2 spp increm # CLASE es el principal atributo de un vector class(abund.t1) class(abund.t2) class(spp) class(increm) # LONGITUD es otro de los principales atributos de un vector length(x=abund.t1) length(x=abund.t2) length(x=spp) length(x=increm) ## IMPORTANTE: Los vectores pueden tener SOLO un tipo de datos: numéricos, # caracteres o lógicos. NUNCA UNA COMBINACIÓN. x <- c(1,2,3) x class(x) x2 <- c(1,2,3,"a") x class(x) ### F. FACTORES ################################################################ # Los factores también representan una secuencia lineal de valores, pero tienen # niveles ("levels") de una variable categórica. # Por ejemplo, suponga que los siguientes datos representan el estado fenológico # de varios árboles: pheno <- c("ster.", "ster.", "flower.", "fruit.", "ster.", "flower.", "flower.", "ster.") pheno length(pheno) class(pheno) mode(pheno) pheno2 <- factor(x=pheno) pheno2 length(pheno2) class(pheno2) mode(pheno2) identical(pheno, pheno2) # Un atributo importante de los factores es los niveles ("levels") levels(pheno2) # IMPORTANTE: la clase de un objeto frecuentemente afecta la forma en que # diferentes funciones procesan el objeto. # Por ejemplo: plot(pheno) plot(pheno2) ### G. MATRICES ################################################################ # Las matrices son similares a los vectores, pero tienen dos dimensiones: filas y # columnas. # Suponga que los siguientes datos representan la abundancia de 5 especies de árboles # (columnas) en 3 sitios distintos (filas): abund.M <- matrix(1:(3*5), nrow=3, ncol=5) abund.M class(abund.M) # La siguiente línea de código usa la distribución de Poisson para simular valores # de abundancia en una matriz: abund.M <- matrix(rpois(3*5, 10), nrow=3, ncol=5) abund.M # Al igual que vectores, matrices tienen LONGITUD length(abund.M) # Además, las matrices tienen DIMENSIONES dim(abund.M) nrow(abund.M) #número de filas ncol(abund.M) #número de columnas # En matrices, frecuentemente es útil crear nombres para las filas y columnas colnames(abund.M) rownames(abund.M) colnames(abund.M) <- spp rownames(abund.M) <- paste("site_", 1:nrow(abund.M), sep="") abund.M ## IMPORTANTE: Matrices, como vectores, pueden tener SOLO un tipo de datos: # numéricos, caracteres o lógicos. NUNCA UNA COMBINACIÓN. abund.M2 <- matrix(sample(c(1:10, letters), 3*5), nrow=3, ncol=5) abund.M2 class(abund.M2) mode(abund.M2) spp abund.t1 abund.t2 mixed.matrix <- cbind(spp, abund.t1, abund.t2) mixed.matrix mode(mixed.matrix) ### H. ARREGLOS ################################################################ # Los arreglos son parecidos a las matrices, pero tienen MÁS DE DOS DIMENSIONES. # Un arreglo con tres dimensiones es como dos matrices, una detrás de la otra # (con filas y columnas alineadas). abund.A <- array(1:(3*5*2), dim=c(3,5,2)) abund.A # La siguiente línea de código usa la distribución de Poisson para simular valores # de abundancia en un arreglo de 3 x 5 x 2: abund.A <- array(rpois(3*5*2, 10), dim=c(3,5,2)) abund.A mode(abund.A) class(abund.A) length(abund.A) dim(abund.A) dimnames(abund.A) # Podemos darle nombre a cada dimensión abund.A dimnames(abund.A) <- list(paste("site_", 1:3, sep=""), spp, c("2008", "2013")) dimnames(abund.A) abund.A ### I. MARCOS DE DATOS ######################################################### # Los marcos de datos contienen observaciones (filas) de diferentes variables # (columnas). De esta manera, CADA COLUMNA PUEDE TENER VALORES DE TIPOS DISTINTOS # (numéricos, caracteres, lógicos o factores). abund.data <- data.frame(spp, abund.t1, abund.t2, increm) abund.data class(abund.data) # IMPORTANTE: las matrices funcionan distinto a los marcos de datos: abund.data2 <- as.matrix(abund.data) abund.data2 class(abund.data) class(abund.data2) dim(abund.data) dim(abund.data2) length(abund.data) length(abund.data2) mode(abund.data) mode(abund.data2) names(abund.data) names(abund.data2) ### J. LISTAS ################################################################## # Las listas también pueden contener elementos de distintos tipos o clases, y NO # necesitan tener la misma longitud. abund.M class(abund.M) pheno class(pheno) abund.data class(abund.data) ejemplo.list <- list(abund.M, pheno, abund.data) # Cada objeto se convierte en un elemento de la lista ejemplo.list # Algunos atributos de una lista: class(ejemplo.list) length(ejemplo.list) dim(ejemplo.list) names(ejemplo.list) names(ejemplo.list) <- c("abund.M", "pheno", "abund.data") ejemplo.list # Examinar la estructura de una lista es muy útil: str(ejemplo.list) ## IMPORTANTE: Muchas funciones utilizan listas para presentar resultados: x <- rnorm(100) y <- 4 + 5*x + rnorm(100) plot(y~x) lm.res <- lm(y~x) lm.res str(lm.res) ### K. OTROS ################################################################### # Muchos análisis o funciones generan objetos de clases particulares. Pero la # gran mayorí­a son modificaciones de las clases básicas de objetos que hemos # revisado. Por ejemplo: # Modelos lineales generan objetos de clase *lm*, que son listas class(lm.res) typeof(lm.res) str(lm.res) # Sin embargo, el hecho de ser de clase *lm* hace que ciertas funciones manejen # este objeto de manera particular. plot(lm.res) # Otra clase de objeto llamada "phylo" se utiliza frecuentemente para representar # filogenias install.packages("ape") # Este código instala un paquete llamado *ape* library(ape) # Este código abre el paquete # El paquete *ape* incluye una filogenia de los órdenes de las aves en un objeto # llamado "bird.orders": ?bird.orders data(bird.orders) #esta línea de código llama (o carga) el objeto con tal filogenia class(bird.orders) # A pesar de ser un objeto de clase *phylo*, este objeto tiene la estructura # de una lista typeof(bird.orders) str(bird.orders) # La función *plot* tiene un efecto particular cuando se aplica a un objeto de # clase "phylo": plot(bird.orders) #este código produce una gráfica de la filogenia