# R para principiantes # PUCE, Quito, 5-8 enero 2010 # Simon Queenborough # MARTES: clase 3 # INGRESANDO DATOS # 1. Ingresando datos por mano # se puede ingresar cada uno: a <- 59 b <- 55 c <- 53.5 d <- 55 e <- 52.5 a b # pero los nombres 'a' no son muy utiles. Mejor darles otros nombres: Wing1 <- 59 Wing2 <- 55 Wing3 <- 53.5 Wing4 <- 55 Wing5 <- 52.5 Wing1 # se puede hacer calculaciones: sqrt( Wing1 ) 2 * Wing1 Wing1 + Wing2 Wing1 + Wing2 + Wing3 + Wing4 + Wing5 (Wing1 + Wing2 + Wing3 + Wing4 + Wing5) / 5 # pero R no guarda los resultados si no son variables nombrados: SQ.wing1 <- sqrt(Wing1) Mul.W1 <- 2 * Wing1 Sum.12 <- Wing1 + Wing2 SUM12345 <- Wing1 + Wing2 + Wing3 + Wing4 + Wing5 Av <- (Wing1 + Wing2 + Wing3 + Wing4 + Wing5) / 5 SQ.wing1 # los nombres deben de ser utiles. # y no incluir letras como: £ $ % ^ & * ( ) { } [ ] @ ~ # ? ! < > # por que la mayoria son operadores # 2. Ingresando con 'c', concatenate Wingcrd <- c(59, 55, 53.5, 55, 52.5, 57.5, 53, 55) Wingcrd[1] Wingcrd [1:5] Wingcrd [-2] # funciones incluidos: S.win <- sum(Wingcrd) S.win mean(Wingcrd) max(Wingcrd) min(Wingcrd) median(Wingcrd) var(Wingcrd) sd(Wingcrd) # los otros datos: Tarsus <- c(22.3, 19.7, 20.8, 20.3, 20.8, 21.5, 20.6, 21.5) Head <- c(31.2, 30.4, 30.6, 30.3, 30.3, 30.8, 32.5, NA) Wt <- c(9.5, 13.8, 14.8, 15.2, 15.5, 15.6, 15.6, 15.7) # Usar nombres para variables que no son nombres de funciones head Head # el 'NA' sum(Head) ?sum sum(Head, na.rm = TRUE) # 3. combinaciones de variables: c, cbind, rbind # en un vector: BirdData <- c(Wingcrd, Tarsus, Head, Wt) # los numeros [1], [14], [27] son numeros de indices BirdData # algo para identificar los variables: Id <- c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4) Id # mas simple: rep(c(1, 2, 3, 4), each = 8) rep(1 : 4, each = 8) a <- seq(from = 1, to = 4, by = 1) a a <- seq(from = 1, to = 4, by = 1) rep(a, each = 8) # parece complicado! pero diferentes analisis necesitan diferentes formas de los datos: en tablas o en vectores # usar nombres en lugar de numeros: VarNames <- c("Wingcrd", "Tarsus", "Head", "Wt") VarNames Id2 <- rep(VarNames, each = 8) Id2 # un 'string' of caracteres # 'each = 8' es muy importante: rep(VarNames, 8) # Unir datos por columnas: cbind Z <- cbind(Wingcrd, Tarsus, Head, Wt) Z Z[,1] # columna 1 Z[1,] # fila 1 z[1:8, 1] Z[1, 1] Z[,2:3] # se puede asignar otras variables: X <- Z[4, 4] Y <- Z[,4] W <- Z[,-3] D <- Z[, c(1, 3, 4)] E <- Z[, c(-1, -3)] # dimensiones de Z n <- dim(Z) n z.row <- dim(Z)[1] z.row Z2 <- rbind(Wingcrd, Tarsus, Head, Wt) Z2 # la funcion 'vector' # generar un vector vacio # util para definir cuantas elementos en el vector e.g. en loops W <- vector(length = 8) w W # llenar el vector W[1] <- 59 W[2] <- 55 W[3] <- 53.5 W[4] <- 55 W[5] <- 52.5 W[6] <- 57.5 W[7] <- 53 W[8] <- 55 W W[1] W[1 : 4] W[2 : 6] W[-2] W[c (1, 3, 5)] W[9] # no hay w[9]! ### matrix ### # uniyendo datos con 'matrix' # en lugar de generar 4 vectores de tamano 8, generamos un matrix de dimension 8 por 4: Dmat <- matrix(nrow = 8, ncol = 4) Dmat # un matrix vacio # llenar el matrix por columna Dmat[, 1] <- c(59, 55, 53.5, 55, 52.5, 57.5, 53, 55) Dmat[, 2] <- c(22.3, 19.7, 20.8, 20.3, 20.8, 21.5, 20.6, 21.5) Dmat[, 3] <- c(31.2, 30.4, 30.6, 30.3, 30.3, 30.8, 32.5, NA) Dmat[, 4] <- c(9.5, 13.8, 14.8, 15.2, 15.5, 15.6, 15.6, 15.7) Dmat # matrix sin nombres # usar 'colnames' colnames(Dmat) <- c("Wingcrd", "Tarsus", "Head", "Wt") Dmat # tambien hay 'rownames'.. # puedes llenar el matrix elemento por elemento: Dmat[1, 1] <- 59.0 Dmat[1, 2] <- 22.3 # pero lleva mas tiempo! # si lo tiene los datos en variables, en lugar de generar un matrix vacio, mejor: Dmat2 <- as.matrix(cbind(Wingcrd, Tarsus, Head, Wt)) Dmat2 # NB: en R hay muchas maneras de hacer la misma cosa. Algunas funciones solo aceptan matrix, no data.frame.. # otras funciones de matrices: is.matrix(Dmat2) # verificar si is matrix t(Dmat2) # transposar Dmat %*% Dmat2 # matrix multiplication solve(Dmat2) # inverse ### data.frame ### # combinar variables de tamano igual ### puedes combinar vectores de numeros, character strings, y factores (nominal or categorical) variables. Dfrm <- data.frame(WC = Wingcrd, TS = Tarsus, HD = Head, W = Wt) Dfrm # puedes hacer calculaciones y incluirlas dentro del data.frame: Dfrm <- data.frame(WC = Wingcrd, TS = Tarsus, HD = Head, W=Wt, Wsq = sqrt(Wt)) Dfrm # el Wt != W rm(Wt) Wt # pero Dfrm$w todovia existe: Dfrm$W # la manera de trabajar en R es: # 1. ingresar los datos (luego), # 2. hacer cambios, transformaciones etc. # 3. guardar los datos modificados en un data.frame para analisar ### list() ### # hasta ahora, cada fila = unidad de sampling # una lista = algo en donde puedes poner muchas variables no relacionadas, como vectores, matrices, characters. # en una lista, cada fila no tiene = 1 unidad de sampling # vector x1 <- c(1, 2, 3) # factor x2 <- c("a", "b", "c", "d") # scalar (vector de tamano 1) x3 <- 3 # matrix x4 <- matrix(nrow = 2, ncol = 2) x4[,1] <- c(1, 2) x4[,2] <- c( 3, 4) # lista Y <- list(x1 = x1, x2 = x2, x3 = x3, x4 = x4) Y # por que hace eso? ## casi todos los resultados producidos por funciones estan guardados en listas: # linear regression M <- lm(WC ~ W, data = Dfrm) names(M) # una lista!: M$coefficients # puede unir todos los datos que hemos generados en una lista: AllData <- list(BirdData = BirdData, Id = Id, Z = Z, VarNames = VarNames) ################################### IMPORTANDO DATOS ###################### # mas facil importar datos de otras programas que ingresar todos otra vez por mano # ! la cosa mas difical en R! # manera de trabajar: # 1. ingresar los datos en un spreadsheet (Excel, Gnumeric, OpenOffice Calc) # 2. exportar los datos como tab-delimited text file # 3. cerrar el spreadsheet # 4. importar los datos a R con 'read.table' # (hay otras maneras de importar datos directamente de Excel, o de bases de datos, o de otros programas estadisticas) # crear un directorio en el C drive: R_Quito setwd("C:\\R_Quito\\data\\") # = setwd("C:/R_Quito/data/") sparrows <- read.table(file = "sparrow.txt",header = TRUE) sparrows